如何在mysql中设置本地列表/元组变量

时间:2018-11-09 18:26:29

标签: mysql sql

是否可以在mysql中执行以下操作?

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

当我尝试执行上述操作时,出现错误:

  

操作数应包含1列

2 个答案:

答案 0 :(得分:1)

该错误来自您的初次分配。您不能将列表分配给变量。

在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”值可能包含逗号,则可能无法使用。)

答案 1 :(得分:1)

不可能在MySQL的用户定义变量中设置元组/列表/数组。您可以使用Dynamic 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;