96

我想将单个值选择到变量中。我试图遵循:

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。

4

11 回答 11

116

我遇到了同样的问题,但我想我知道是什么导致了混乱。如果你使用 MySQL Query Analyzer,你可以这样做:

SELECT myvalue 
INTO @myvar 
FROM mytable 
WHERE anothervalue = 1;

但是,如果您将相同的查询放在 MySQL Workbench 中,它将引发语法错误。我不知道为什么它们会有所不同,但它们确实如此。

要解决 MySQL Workbench 中的问题,您可以像这样重写查询:

SELECT @myvar:=myvalue
FROM mytable
WHERE anothervalue = 1;
于 2011-09-07T18:46:34.553 回答
47

最后,存储过程是我的问题的解决方案。

这是有帮助的:

DELIMITER //

CREATE PROCEDURE test ()
BEGIN
  DECLARE myvar DOUBLE;
  SELECT somevalue INTO myvar FROM mytable WHERE uid = 1;

  SELECT myvar;
END//

DELIMITER ;

call test();
于 2010-06-19T11:57:36.097 回答
46

这些答案不能很好地涵盖多个变量。

在存储过程中进行内联赋值会导致这些结果也被发送回结果集中。这可能会令人困惑。要对多个变量使用 SELECT...INTO 语法,请执行以下操作:

SELECT a, b INTO @a, @b FROM mytable LIMIT 1;

SELECT 必须只返回 1 行,因此 LIMIT 1,尽管这并不总是必要的。

于 2014-09-09T21:51:40.503 回答
24

您也可以使用 SET 代替 DECLARE

SET @myvar := (SELECT somevalue INTO myvar FROM mytable WHERE uid=1);

SELECT myvar;
于 2014-10-13T02:33:44.757 回答
15

根据MySQL 文档DECLARE 仅在 BEGIN...END 块的开头起作用,就像在存储程序中一样。

于 2010-06-19T10:26:59.033 回答
12

您不需要在 MySQL 中声明变量。变量的类型在第一次被赋值时自动确定。它的类型可以是以下之一:整数、十进制、浮点、二进制或非二进制字符串或 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)
于 2010-06-19T10:36:23.607 回答
5

我在 Windows Vista 上使用版本 6(适用于 Windows 版本 6.0.9 修订版 11421 build 1170 的 MySQL Workbench Community (GPL))。我对以下选项没有任何问题。可能他们修复了它,因为这些人三年前遇到了问题。

/* 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';

上面的所有选项都给了我一个正确的结果。

于 2014-05-17T23:11:14.213 回答
4

值得注意的是,尽管您可以使用以下SELECT INTO全局变量:

SELECT ... INTO @XYZ ...

不能使用FETCH INTO全局变量,例如:

FETCH ... INTO @XYZ

看起来这不是一个错误。我希望它对某人有帮助...

于 2014-01-30T03:05:01.643 回答
4

对于那些现在遇到此类问题的人,只需尝试为表添加别名,这应该是诀窍,例如:

SELECT myvalue 
  INTO myvar 
  FROM mytable x
 WHERE x.anothervalue = 1;

它对我有用。

干杯。

于 2016-11-30T10:23:24.373 回答
1

你可能会错过你的价值之前的@符号,就像那样select 'test' INTO @myValue

于 2016-08-13T02:45:42.953 回答
0

SELECT c1, c2, c3, ... INTO @v1, @v2, @v3,... FROM table_name WHERE 条件;

于 2020-01-20T12:40:49.330 回答