Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用in()函数的用户定义会话变量返回意外结果_Mysql_Sql_Mysql5 - Fatal编程技术网

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
的字段,其值分别为12。运行此语句

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");
它返回我的期望值

真的


有什么我错过的吗?我需要它返回TRUE

in语句正在寻找逗号分隔的值,这些值可以是字符串、整数、双精度和浮点数等等。大多数数据类型都可以使用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