在SELECT语句中设置一个变量 - MySQL

时间:2013-03-22 22:42:14

标签: mysql variables concatenation

我使用的代码有错误:

SET @rejects = '';

SELECT *
FROM list
WHERE maker = 1
    AND by_ids IN ('10','11')
    AND country LIKE '%I%'
    AND (
        src IS NULL
        || src NOT IN (@rejects)
        AND checkSrc(src) = 'yes'
        AND SET @rejects = CONCAT(@rejects,',',src)
    );

是什么导致了这个问题?

2 个答案:

答案 0 :(得分:7)

问题是你不能在一个语句中混合使用selectset,肯定会出现语法错误:

select*from t where 1 and set@a=1;
  

错误1064(42000):您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第1行的“set @ a = 1”附近使用正确的语法

如果您想在set内执行select,请使用the colon equals语法。改变这个:

select*from t where 1 and set@a=1;

成:

select*,@a:=1 from t where 1;

以下是更新每个行的变量的方法:

create table t(id int); insert t values(1),(2),(3);
set@a=0;
select@a:=id from t;
+--------+
| @a:=id |
+--------+
|      1 |
|      2 |
|      3 |
+--------+

你甚至可以concat

set@a='0';
select @a:=concat(@a,',',id)from t;
+-----------------------+
| @a:=concat(@a,',',id) |
+-----------------------+
| 0,1                   |
| 0,1,2                 |
| 0,1,2,3               |
+-----------------------+

concat没有前导0

set@a='';
select @a:=concat(@a,if(@a='','',','),id)from t;
+------------------------------------+
| @a:=concat(@a,if(@a='','',','),id) |
+------------------------------------+
| 1                                  |
| 1,2                                |
| 1,2,3                              |
+------------------------------------+

但是,明确手册指出这很危险:link

  

...你应该从不为用户变量赋值并阅读   同一声明中的价值...

     

...你可能得到你期望的结果,但这没有   保证即可。

     

...涉及用户变量的表达式的评估顺序是   的未定义

这也被提及on Xaprb

最后,如果你正在做 quirky 之类的事情,例如为变量等分配不同的值类型,checkout the manual以确保你理解错综复杂的机制。

答案 1 :(得分:2)

然后你可以写这样的查询。

SET @rejects = '';
SELECT @rejects = CONCAT(@rejects,',',src) FROM list WHERE maker = 1 AND by_ids IN ('10','11') AND country LIKE '%I%' AND 
(src IS NULL OR src NOT IN (@rejects) AND checkSrc(src) = 'yes');
SELECT @rejects;