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



例如,我有一个名为TABLE的表,它有一个名称为FIELD的字段,值分别为12。运行此语句

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

SELECT @LIST;

返回

1,2

然后我执行IF()语句

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

返回

真正的

但是当我运行这个时

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

它返回

所以我试着用这个语句来调试

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

它会返回我的期望值

真正的

那是不是我错过了什么?我需要它返回

变量@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

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的内容。

相关内容

  • 没有找到相关文章

最新更新