例如,我有一个名为TABLE
的表,它有一个名称为FIELD
的字段,值分别为1和2。运行此语句
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的内容。