在IN()函数中使用的用户定义的会话变量返回意外的结果

时间:2014-09-25 03:18:34

标签: mysql sql mysql5

例如,我有一个名为TABLE的表,它有一个名为FIELD的字段,其值 1 2 。运行此声明

SELECT GROUP_CONCAT(`FIELD`)  
INTO @LIST 
FROM `TABLE`;

SELECT @LIST;

返回

  

1,2

然后我做了一个 IF()语句

SELECT IF (1 IN(@LIST),"TRUE","FALSE");

返回

  

TRUE

我跑这个时

SELECT IF (2 IN(@LIST),"TRUE","FALSE");

它返回

  

FALSE

所以我尝试这个语句进行一些调试

SELECT IF (2 IN(1,2),"TRUE","FALSE");

并返回我的期望值

  

TRUE

那么我错过了什么吗?我需要它返回 TRUE

2 个答案:

答案 0 :(得分:1)

变量@LIST有一个字符串类型值:'1,2'。要在此值列表中测试值,您必须使用字符串函数:FIND_IN_SET

SELECT IF (FIND_IN_SET(1, @LIST), "TRUE","FALSE");
SELECT IF (FIND_IN_SET(2, @LIST), "TRUE","FALSE");

在此测试:http://sqlfiddle.com/#!2/4fce1d/1

答案 1 :(得分:0)

in语句正在查找逗号分隔值,可以是字符串,整数,双精度和浮点数等等。对于大多数数据类型,您可以使用in语句。什么数据类型是@LIST?一个varchar?您的@LIST是一个类似于'1,2'的字符串,而不是像1,2这样的逗号分隔值列表。细微但非常重要的区别。你不能像上面那样使用IN语句。

但是,如果您将查询创建为字符串,然后将该字符串作为动态sql执行,我敢打赌它会起作用。

请尝试以下方法:

 SELECT GROUP_CONCAT(`FIELD`)  
 INTO @LIST 
 FROM `TABLE`;

 SET @s = CONCAT('SELECT IF (2 IN(',@LIST,'),"TRUE","FALSE");'); 

 PREPARE stmt1 FROM @s; 
 EXECUTE stmt1; 
 DEALLOCATE PREPARE stmt1; 

阅读有关动态SQL的信息。