MySQLのコマンドライン・クライアントを開き、次のSQL文を入力します。mysストアド・ファンクションに設定されたweiredセッション変数の値
use green;
delimiter $
drop function if exists tstFunction $
create function tstFunction(cnt int) returns int
begin
case when 1 > cnt then set @a1 := 1;
when 5 > cnt then set @a2 := 2;
when 4 > cnt then set @a3 := 3;
else set @a4 := 4;
end case;
return 0;
end $
delimiter ;
select tstFunction(3), @a1, @a2, @a3, @a4;
私がテストしたいのは、CASE WHEN複合ステートメントの実行フローです。上記SELECT
文のクエリの結果は、ここに行く:
tstFunction(3) @a1 @a2 @a3 @a4
0 NULL NULL NULL NULL
私は@a2
の値の混乱しています。なぜNULL
ですか?なぜ2
?
だから私は新しいMySQLコマンドラインクライアントを開き、tstFuncton
を再構築しますが、そのような2つのラインにSELECT
文を区切る:
select tstFunction(3);
select @a1, @a2, @a3, @a4;
そして新しいクエリ結果が良くなります。
@a1 @a2 @a3 @a4
NULL 2 NULL NULL
何SELECT
声明の最初の形式に起こった?なぜ私はそれを2つに分割する必要がありますSELECT
ステートメント?
を変数を宣言?私が読む必要がある何か他にありますか? –
バッチは、オプティマイザが一度に処理するステートメントの数を意味します。 –
とにかく、オプティマイザが最初のSELECTフォームのクエリフィールドの計算順序を調整した理由は何ですか?つまり、フィールドは他の3つのフィールドよりも後で計算されるように最適化されています。 –