ホームページ >データベース >mysql チュートリアル >単一の SQL SELECT ステートメントで変数を使用すると、予期しない結果が返されることが多いのはなぜですか?
SELECT ステートメント内での変数の宣言と使用
SQL では、変数に値を割り当て、同じクエリ内でその値を取得できます。挑戦的であること。次の例を考えてみましょう。
SELECT @z:=SUM(item), 2*@z FROM TableA;
このクエリは、「item」列の合計を計算し、それを「@z」という名前の変数に格納しようとします。次に、「@z」の値を 2 で乗算します。しかし、驚くべきことに、2 番目の列は常に NULL を返します。
これは、MySQL のドキュメントに、値をユーザー変数に代入し、それをユーザー変数内で読み取ることが明示的に記載されているために発生します。同じ記述に依存すべきではありません。このような式の評価順序は未定義であり、将来のリリースで変更される可能性があります。
これをさらに説明するために、代替クエリを考えてみましょう。
SELECT @z:=someProcedure(item), 2*@z FROM TableA;
このクエリでは、「@z」は次のようになります。プロシージャ呼び出しを介して値を割り当てます。このシナリオでは、プロシージャ呼び出しが変数の割り当てとは別に評価されるため、クエリは期待どおりに機能します。
ユーザー変数の制限を克服するには、サブクエリを利用して値を割り当て、メイン内で値を取得できます。 query:
select @z, @z*2 from (SELECT @z:=sum(item) FROM TableA ) t;
このサブクエリでは、SELECT を使用して "@z" の値が割り当てられます。次に、メインクエリは「@z」を選択し、必要な計算を実行します。
以上が単一の SQL SELECT ステートメントで変数を使用すると、予期しない結果が返されることが多いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。