Как установить локальную переменную list / tuple в mysql - PullRequest
0 голосов
/ 09 ноября 2018

Есть ли способ сделать следующее в mysql?

SET @studios = ('Disney', 'Warner Bros.', 'Fox');
SELECT * FROM movies WHERE provider IN @studios;

Когда я пытаюсь сделать это, я получаю сообщение об ошибке:

Операнд должен содержать 1 столбец (ы)

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Невозможно установить кортеж / список / массив в пользовательской переменной в MySQL. Вы можете использовать Динамический SQL для того же:

-- we use single quotes two times to escape it
SET @studios = '(''Disney'', ''Warner Bros.'', ''Fox'')';

-- generate the query string
SET @query = CONCAT('SELECT * FROM movies WHERE provider IN ', @studios);

-- prepare the query
PREPARE stmt FROM @query;

-- execute it
EXECUTE stmt;

-- deallocate it
DEALLOCATE PREPARE stmt;
0 голосов
/ 09 ноября 2018

Ошибка исходит от вашего первоначального назначения. Вы не можете назначать списки переменным.

Единственный способ сделать это в MySQL - это либо создать временную таблицу для хранения значений, а затем выполнить ... IN (SELECT someVal FROM thatTemp), либо динамически создать запрос со значениями непосредственно в строке запроса.


Пример создания временной таблицы:

CREATE TEMPORARY TABLE `someTemp` ( someVal VARCHAR(16) );
INSERT INTO `someTemp` (someVal) VALUES ('a'), ('b'), ('c');
SELECT * FROM myTable WHERE myField IN (SELECT someVal FROM someTemp);
DELETE TEMPORARY TABLE `someTemp`;

Кроме того, есть также FIND_IN_SET , который можно использовать следующим образом:

SET @list = 'a,b,c';
SELECT * FROM myTable WHERE FIND_IN_SET(myField, @list) <> 0;

но этот метод, вероятно, имеет крайне низкую производительность (и может быть неприменим, если ваши значения "myField" могут содержать запятые).

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