在 SELECT 语句中设置变量 - MySQL

Posted

技术标签:

【中文标题】在 SELECT 语句中设置变量 - MySQL【英文标题】:SET a variable in SELECT statement - MySQL 【发布时间】:2013-03-12 22:32:13 【问题描述】:

我正在使用这个有错误的代码:

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)
    );

导致问题的原因是什么?

【问题讨论】:

可能是by_ids INT('10','11')by_ids IN('10','11') 为什么 AND SET @rejects = CONCAT(@rejects,',',src)WHERE 子句中? 这就是我想要的,我想将每个搜索到的 src 的值连接到 @rejects 变量中。 ||不应用作或。 您可以在搜索“mysql group by best/top n”或类似内容时看到示例 - 这是因为 MySQL 解决方案需要一些有趣的技巧(通常只是增加一个计数器)。 【参考方案1】:

那么你可以这样写你的查询。

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;

【讨论】:

您的预期输出是什么?此外,如果 src 为空,则可能存在问题。你能发布你的表结构和预期的输出吗?【参考方案2】:

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

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

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

如果您想在select 中执行set,请使用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                              |
+------------------------------------+

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

...您应该从不为用户变量赋值并读取 同一语句中的值...

...你可能会得到你期望的结果,但这是 不是 保证

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

on Xaprb 也提到了这一点。

最后,如果您正在做古怪的事情,例如为变量分配不同的值类型等,checkout the manual 以确保您了解复杂的机制。

【讨论】:

"...您永远不应该为用户变量赋值并在同一语句中读取该值..." 这为我节省了大量的试验和-错误。

以上是关于在 SELECT 语句中设置变量 - MySQL的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL,使用单个选择语句在存储过程中设置两个变量

在 T-SQL CASE 语句的 WHEN 条件中设置变量等于数字时语法不正确[关闭]

在 SQL 查询中设置差异

mysqls

怎样在Ubuntu中设置环境变量

如何在内存数据库中设置 fetchSize?