ホームページ >データベース >mysql チュートリアル >単一の SQL SELECT ステートメントで変数を使用すると、予期しない結果が返されることが多いのはなぜですか?

単一の SQL SELECT ステートメントで変数を使用すると、予期しない結果が返されることが多いのはなぜですか?

DDD
DDDオリジナル
2024-12-20 22:29:13349ブラウズ

Why Does Using Variables in a Single SQL SELECT Statement Often Return Unexpected Results?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。