2011-02-07 18 views
1

mysqlは宣言型言語であるため、割り当て変数の順序を強制的に変更する方法が見つかりません。mysql変数の割り当て:どのように割り当て順序を強制するのですか?

は、このクエリを取る:

SET @v1=0; 
SET @v2=0; 

SELECT @v1, @v2 
FROM MyTable table 
WHERE (@v1:[email protected]) is not null 
    AND (@v2:=2) is not null; 

結果は次のとおりです。

@v1 | @v2 
--------- 
2 | 2 

@ V2はMySQLのエンジンにより、@ v1の前に解析されるためです。

どのように私はこの結果を持っている割り当ての順序を強制することができます。

@v1 | @v2 
--------- 
0 | 2 

編集:ここではVariable assignment with mysql

がない理由を割り当て順序を強制的にについての質問です:これは同じ問題ではありません結果は期待通りではありません。

UPDATE:あなたは左外部結合を使用する場合 は、結果も奇妙である。この場合、

SET @v1=0; 

SELECT @v1 
FROM Account other 
LEFT OUTER JOIN SimpleValue f_PC ON f_PC.accountId=other.id AND f_PC.refShortcut='PC' 
WHERE CASE WHEN (other.context='44') THEN (@v1:[email protected]+1) ELSE null END 
ORDER BY @v1 ASC 

は、クエリは60件の結果を返しますが、@ v1の値は、私が削除した場合は120

です左外部結合、v1値は60です。なぜですか?

+0

[mysqlで変数を割り当てる](http://stackoverflow.com/questions/4924021/variable-assignment-with-mysql) –

+0

なぜこの質問をもう一度聞かれますか? –

+0

これは同じ質問ではありませんが、他の質問はなぜ私がこれらの結果を持っているかです。この質問は、今私はどのように期待される結果を得るために行うことができます。 StackOverflowはフォーラムではないので、別の質問を開くのが好きです。質問を編集して変換するだけで、他の質問を読んだ人は答えられないと思います。 –

答えて

0

あなたの他の質問に対する回答に説明されているように、動作することは保証されていません。クエリのSELECT部分​​に割り当てを移動し、あなたの特定のケースで

は、動作しているようです:

select声明の中で
SET @v1=0; 
SET @v2=0; 

SELECT (@v1:[email protected]), (@v2:=2) 
FROM DUAL 
+0

where文節でvariableを使用し、select文の代入文がクライアントに応答を送信するときにのみ計算されるため、select文に移動できません –

1

、句は、左から右に行くBOTTOMへTOPので、それは動作します(MS Accessは同じ戦略を使用しています)。ただし、WHERE句では、すべてのベットはオフになり、最適なフィルタが選択されます。 CASEステートメントが左から右への評価(提示順序を保持)を必要とするという事実を利用することによって、強制的にそれを強制することができます。

WHERE CASE WHEN (@v1:[email protected]) is not null THEN (@v2:=2) ELSE (@v2:=2) = 0 END 

この力は、分岐のいずれかで評価する(と@ V2に2を代入)することであるが、唯一の第一の実行のために、V1:@ = @ v2はnullを返し、@ V2は0と比較されて2となります全体としてFALSEです。 2回目は@v1 := @v2 [= 2](@v2:=2)は2(true)となります。

+0

この回答はありがたいですが、左外部結合では実行されません。私の更新を参照してください;) –

関連する問題