mysqlで変数に選択します宣言は構文エラーを引き起こしますか?
-
28-09-2019 - |
質問
変数に単一の値を選択したいと思います。私はフォローしようとしました:
DECLARE myvar INT(4);
- すぐにいくつかの構文エラーを返します。
SELECT myvalue
FROM mytable
WHERE anothervalue = 1;
- 単一の整数を返します
SELECT myvalue
INTO myvar
FROM mytable
WHERE anothervalue = 1;
- 機能しない、@Myvarも試した
ストアドプロシージャや関数以外で宣言することは可能ですか?
たぶん私はユーザー変数の概念を取得しないだけかもしれません...私はちょうど試しました:
SELECT myvalue INTO @var FROM `mytable` WHERE uid = 1;
SELECT @var;
...それが想定されているように機能しました。しかし、一度に各クエリを実行すると、@var nullを取得します。
解決 2
最終的に、ストアドプロシージャが私の問題の解決策でした。これが役立ったものです:
DELIMITER //
CREATE PROCEDURE test ()
BEGIN
DECLARE myvar DOUBLE;
SELECT somevalue INTO myvar FROM mytable WHERE uid=1;
SELECT myvar;
END
//
DELIMITER ;
call test ();
他のヒント
私はこの同じ問題に出くわしましたが、何が混乱を引き起こしているのか知っていると思います。 MySQLクエリアナライザーを使用する場合、これを正常に行うことができます。
SELECT myvalue
INTO @myvar
FROM mytable
WHERE anothervalue = 1;
ただし、同じクエリをMySQLワークベンチに配置すると、構文エラーが発生します。なぜ彼らが違うのかわかりませんが、そうです。 MySQLワークベンチで問題を回避するには、次のようなクエリを書き直すことができます。
SELECT @myvar:=myvalue
FROM mytable
WHERE anothervalue = 1;
これらの答えは、複数の変数をあまりカバーしていません。
ストアドプロシージャでインライン割り当てを行うと、結果が結果セットにも送信されます。それは混乱する可能性があります。 Selectを使用することは、複数の変数を持つ構文にselectに使用することです。
SELECT a, b INTO @a, @b FROM mytable LIMIT 1;
選択は1行のみを返す必要があります。したがって、制限1は必ずしも必要ではありません。
宣言する代わりにセットを使用することもできます
SET @myvar := (SELECT somevalue INTO myvar FROM mytable WHERE uid=1);
SELECT myvar;
あたり MySQLドキュメント 宣言は、開始の開始時にのみ動作します...保存されたプログラムのように、終了ブロック。
mysqlで変数を宣言する必要はありません。変数のタイプは、最初に値が割り当てられたときに自動的に決定されます。そのタイプは、整数、小数、フローティングポイント、バイナリまたは非バイナリ文字列、またはヌル値の1つです。詳細については、ユーザー定義の変数のドキュメントを参照してください。
http://dev.mysql.com/doc/refman/5.0/en/user-variables.html
select ... ingingに列を変数に割り当てることができます。
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 Revision 11421 Build 1170)にバージョン6(MySQLワークベンチコミュニティ(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;
それは私のために働いた。
乾杯。