Mysql 使用in()函数的用户定义会话变量返回意外结果
例如,我有一个名为Mysql 使用in()函数的用户定义会话变量返回意外结果,mysql,sql,mysql5,Mysql,Sql,Mysql5,例如,我有一个名为table的表,它有一个名为field的字段,其值分别为1和2。运行此语句 SELECT GROUP_CONCAT(`FIELD`) INTO @LIST FROM `TABLE`; SELECT IF (1 IN(@LIST),"TRUE","FALSE"); 及 返回 1,2 然后我执行一个IF()语句 SELECT GROUP_CONCAT(`FIELD`) INTO @LIST FROM `TABLE`; SELECT IF (1 IN(@LIST),
table
的表,它有一个名为field
的字段,其值分别为1和2。运行此语句
SELECT GROUP_CONCAT(`FIELD`)
INTO @LIST
FROM `TABLE`;
SELECT IF (1 IN(@LIST),"TRUE","FALSE");
及
返回
1,2
然后我执行一个IF()语句
SELECT GROUP_CONCAT(`FIELD`)
INTO @LIST
FROM `TABLE`;
SELECT IF (1 IN(@LIST),"TRUE","FALSE");
返回
真的
但是当我运行这个时
SELECT IF (2 IN(@LIST),"TRUE","FALSE");
它回来了
假的
所以我试着用这个语句进行一点调试
SELECT IF (2 IN(1,2),"TRUE","FALSE");
它返回我的期望值
真的
有什么我错过的吗?我需要它返回TRUEin语句正在寻找逗号分隔的值,这些值可以是字符串、整数、双精度和浮点数等等。大多数数据类型都可以使用in语句。@LIST是什么数据类型?瓦查尔?@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。变量
@LIST
有一个字符串类型值:'1,2'
。若要测试值是否在此值列表中,必须使用字符串函数::
在此处测试:Neat solution重要的是要理解IN不接受逗号分隔的字符串作为输入,而是接受逗号分隔的值列表作为输入。在您的语句中,
@list
实际上相当于单个字符串文本'1,2'
。但它是在数值上下文中计算的,MySQL将其计算为等于整数1
。(请尝试SELECT@LIST+0
,然后SELECT@LIST+4
,查看返回的内容。因此,您的谓词实际上是SELECT IN(1)
。在单引号中,SELECT'1'IN('1,2')
结果将不同。底线:字符串内的逗号(无论是文字还是udv)不会被解释为SQL文本的一部分。您可以在字符串文本或udv上使用字符串比较函数,例如在\u集中查找\u
。