例如,我有一个名为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 。
答案 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");
答案 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的信息。