Странное поведение пользовательских переменных в MySQL - PullRequest
1 голос
/ 10 мая 2011

Я заметил кое-что странное в пользовательских переменных:

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

 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.

Мне кажется, это должно работать или не работать.Есть идеи, почему он работает только с первым номером в списке?

Ответы [ 2 ]

2 голосов
/ 10 мая 2011

Вы не можете использовать IN () с переменной и рассматривать эту переменную как список - можно использовать только фактические списки (возможно, переменных) - т.е. IN (1, 2, 3) или IN (@var1, @var2, @var3)

Ни один из них не должен работать, если @var содержит «3, 6, 9» - поэтому я подозреваю, что @var содержит «3», - вы можете проверить его содержимое?

Мартин мог бы что-то сделать с кастингом - держу пари, что '3' IN (@var) ничего не возвращает

1 голос
/ 10 июля 2012

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

SELECT FIND_IN_SET(6, @var)

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

SELECT FIND_IN_SET(7, @var)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...