2011-05-10 6 views
1

Я заметил что-то странное, определяемых пользователем переменных:Одд поведение определяемых пользователем переменных в MySQL

Допустим, у меня есть эта таблица:

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. –

ответ

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

1

Вы не можете использовать IN() с переменной строки - но вы можете использовать FIND_IN_SET() вместо этого, который служит именно этой цели:

SELECT FIND_IN_SET(6, @var) 

возвращает 2 - вторая позиция

SELECT FIND_IN_SET(7, @var) 

возвращает NULL - не совпадает

Смежные вопросы