2016-08-27 5 views
0

私は、クエリ(トリガー)を持っている:ご覧のとおりクエリの結果を変数に格納して複数回使用するにはどうすればよいですか?このような

BEGIN  
    IF (new.edited_id IS NULL) THEN 
     IF (SELECT 1 FROM users WHERE id = new.author_id AND IFNULL((active & b'1000000' > 0), 0) < 1) THEN 
      SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = "you cannot ask anymore"; 
     ELSEIF (SELECT 1 FROM users WHERE id = new.author_id AND IFNULL((active & b'10000000' > 0), 0) < 1) THEN 
      SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = "you cannot answer anymore"; 
     END IF; 
    ELSE 
     IF (SELECT 1 FROM users WHERE id = new.author_id AND IFNULL((active & b'100000000' > 0), 0) < 1) THEN 
      SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = "you cannot edit anymore"; 
     END IF; 
END 

は、それらの内部IF文の条件はほぼ同じです。さて、どうすればそれを改善できますか?

私が意味する、どのように私は変数にクエリを次の結果を保存することができます。その後、

SELECT active FROM users WHERE id = new.author_id; 

そして、これらのようなそれらの条件にそれを使用します。

IF (IFNULL((@variable & b'1000000' > 0), 0) < 1) THEN 
IF (IFNULL((@variable & b'10000000' > 0), 0) < 1) THEN 
IF (IFNULL((@variable & b'100000000' > 0), 0) < 1) THEN 

は、どのように私はそれを扱うことができますか?

答えて

1

local variableを宣言し、select文の出力で設定します。

DECLARE v_active bit(10); 
SET v_active := (SELECT active FROM users WHERE id = new.author_id); 
+0

'active'は' BIT(10) 'データ型です。 –

+0

私はデータ型を変更しました。 –

+0

ありがとう.. upvote ..私の情報のために、変数を 'DECLARE'して何もSETしないとどうなりますか?つまり、デフォルトの*データ型は何ですか? –

関連する問題