単一の値を変数に選択したいと思います。私は次のことを試みました:
DECLARE myvar INT(4);
-すぐに構文エラーを返します。
SELECT myvalue
FROM mytable
WHERE anothervalue = 1;
-単一の整数を返します
SELECT myvalue
INTO myvar
FROM mytable
WHERE anothervalue = 1;
-動作しません、@ myvarも試しました
ストアドプロシージャまたは関数の外部でDECLAREを使用できますか?
たぶん、ユーザー変数の概念がわからないだけです...
SELECT myvalue INTO @var FROM `mytable` WHERE uid = 1;
SELECT @var;
...想定どおりに機能しました。しかし、一度に各クエリを実行すると、@ var NULLが取得されます。
結局、ストアドプロシージャが私の問題の解決策でした。助けたのは次のとおりです。
DELIMITER //
CREATE PROCEDURE test ()
BEGIN
DECLARE myvar DOUBLE;
SELECT somevalue INTO myvar FROM mytable WHERE uid=1;
SELECT myvar;
END
//
DELIMITER ;
call test ();
私はこれと同じ問題にぶつかりましたが、混乱の原因はわかっていると思います。 MySql Query Analyzerを使用している場合、これをうまく行うことができます。
SELECT myvalue
INTO @myvar
FROM mytable
WHERE anothervalue = 1;
ただし、同じクエリをMySql Workbenchに配置すると、構文エラーがスローされます。なぜ違うのかわかりませんが、違います。 MySql Workbenchの問題を回避するには、次のようにクエリを書き換えます。
SELECT @myvar:=myvalue
FROM mytable
WHERE anothervalue = 1;
これらの答えは、複数の変数をうまくカバーしていません。
ストアドプロシージャでインライン割り当てを行うと、それらの結果も結果セットに送り返されます。それはわかりにくいかもしれません。複数の変数でSELECT ... INTO構文を使用するには:
SELECT a, b INTO @a, @b FROM mytable LIMIT 1;
SELECTは1行のみを返す必要があるため、LIMIT 1は常に必要ではありませんが、LIMIT 1を返す必要があります。
DECLAREの代わりにSETを使用することもできます
SET @myvar := (SELECT somevalue INTO myvar FROM mytable WHERE uid=1);
SELECT myvar;
MySQL docs DECLAREは、ストアドプログラムのようにBEGIN ... ENDブロックの開始時にのみ機能します。
MySQLで変数を宣言する必要はありません。変数のタイプは、最初に値が割り当てられたときに自動的に決定されます。タイプは、整数、10進数、浮動小数点、バイナリまたは非バイナリ文字列、またはNULL値のいずれかです。詳細については、ユーザー定義変数のドキュメントを参照してください。
http://dev.mysql.com/doc/refman/5.0/en/user-variables.html
SELECT ... INTOを使用して、変数に列を割り当てることができます。
http://dev.mysql.com/doc/refman/5.0/en/select-into-statement.html
例:
mysql> SELECT 1 INTO @var;
Query OK, 1 row affected (0.00 sec)
mysql> SELECT @var;
+------+
| @var |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
以下のようなグローバル変数をSELECT INTO
できるという事実にもかかわらず、注目に値します:
SELECT ... INTO @XYZ ...
次のようなFETCH INTO
グローバル変数を使用して、ではなくを使用できます。
FETCH ... INTO @XYZ
バグ ではないようです。私はそれが誰かに役立つことを願っています...
Windows Vistaでバージョン6(Windowsバージョン6.0.9リビジョン11421ビルド1170用のMySQL Workbench Community(GPL))を使用しています。次のオプションに問題はありません。これらの人たちが3年前に問題を抱えたので、おそらく彼らはそれを修正しました。
/* first option */
SELECT ID
INTO @myvar
FROM party
WHERE Type = 'individual';
-- get the result
select @myvar;
/* second option */
SELECT @myvar:=ID
FROM party
WHERE Type = 'individual';
/* third option. The same as SQL Server does */
SELECT @myvar = ID FROM party WHERE Type = 'individual';
上記のすべてのオプションで正しい結果が得られます。
select 'test' INTO @myValue
のように、値の前に@記号が欠落している可能性があります。
そのような問題を今すぐ実行している人のために、テーブルのエイリアスを入れてみてください、これはトリックです、例えば:
SELECT myvalue
INTO myvar
FROM mytable x
WHERE x.anothervalue = 1;
それは私のために働いた。
乾杯。