2014-09-25 68 views
0

例如我有一个表名为TABLE并且它具有命名FIELD与值和的单个字段。运行此语句用户定义会话变量()函数返回意想不到的结果

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

+1

在你的语句,'@ LIST'实际上相当于一个字符串文字''1, 2''。但是它正在数值上下文中进行评估,MySQL正在评估它等于整数'1'。 (尝试'SELECT @ LIST + 0'和'SELECT @ LIST + 4',看看返回的是什么,所以,你的谓词有效地是'SELECT 1 IN(1)'。在单引号中,'SELECT'1'IN '1,2')'结果将会有所不同**底线:**字符串内的**逗号**(不管字面量还是udv)是**不会被解释为SQL文本的一部分。你可以在字符串文字或udv上使用字符串比较函数,例如'FIND_IN_SET' – spencer7593 2014-09-25 03:48:26

回答

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"); 

测试在这里:http://sqlfiddle.com/#!2/4fce1d/1

+2

整洁的解决方案很重要的一点是,IN不需要以逗号分隔的字符串作为输入,而是以逗号分隔的列表作为输入。 – Namphibian 2014-09-25 03:43:21

0

在声明中寻找逗号分隔的值,可以是字符串,整数,双打和浮动等等。你可以在大多数数据类型中使用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。