2011-05-10 97 views
1

我注意到一些奇怪的关于用户定义的变量:古怪的行为

可以说我有这个表:

num_table 
+---------+ 
| numbers | 
| 3 | 
| 6 | 
| 9 | 
+---------+ 

我可以创建一个逗号分隔的列表并将其存储在一个用户定义的变量,像这样:

SELECT @var := GROUP_CONCAT `numbers` from num_table; 

这将值3,6,9分配给@var

这里是奇怪的部分。运行

SELECT 3 IN (@var) 

返回1,但运行

SELECT 6 IN (@var) 

返回0

在我看来,它应该工作或不工作。任何想法为什么它只适用于列表中的第一个数字?

+3

我会想象它将'3,6,9'转换为数字,最终忽略了第一个非数字字符以后的任何内容,因此最终以3结尾。 – 2011-05-10 15:59:50

回答

2

不能使用IN()具有可变和有变量作为列表处理 - 只有实际列表(也许是变量),可以使用 - 即IN (1, 2, 3)IN (@var1, @var2, @var3)

如果@var包含“3也应该工作, 6,9' - 所以我怀疑@var包含'3',但是 - 你能验证它的内容吗?

马丁可能将要发生什么与铸造 - 我敢打赌'3' IN (@var)返回任何

+0

OK @Martin似乎是正确的。我可以验证@var确实包含列表,因为'SELECT @var LIKE'%6%''retunrs'1'。 – jisaacstone 2011-05-10 16:27:32

1

你不能用一个字符串变量使用IN() - 但你可以使用FIND_IN_SET()来代替,该服务正是为此目的:

SELECT FIND_IN_SET(6, @var) 

返回2 - 第二位置

SELECT FIND_IN_SET(7, @var) 

返回NULL - 无匹配