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



在mysql中有办法做到以下几点吗?

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

当我尝试做上述操作时,我会得到错误:

操作数应包含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"值可能包含逗号,则可能不可用(。

在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;

您可以将列表连接到一个字符串,并使用FIND_IN_SET作为标准。可能不是非常高效,但使代码易于阅读和维护。

看起来像这样:

SET @studios = CONCAT_WS(',',
'Disney',
'Warner Bros.',
'Fox'
);
SELECT * FROM movies 
WHERE FIND_IN_SET(provider, @studios) <> 0;

最新更新