我有一个查询,如下所示:
select *
from foo
where bar in ("bla", "blub")
and anotherField in ("bla", "blub")
是否可以为("bla", "blub")
数组命名,是否可以在不使用set
的情况下对其进行命名?
答案 0 :(得分:2)
MySQL变量只能保存其原始数据类型。 MySQL中没有数组,也没有能够在变量中存储多个值。
所以,对你的问题的简短回答是“不,这是不可能的”。但这通常不是什么大问题,因为您的应用程序通常使用更高级别的语言构造SQL,在这种语言中您可以将这样的集合保存在变量中:因此可以从该变量构建相同的IN()
表达式不得不在很大程度上重复自己。这基本上是@NikhilButani's answer通过语句准备完成的。
也就是说,值的集合可以在SQL中表示:毕竟,这正是 tables 的含义。因此,可以通过将值存储在表中来解决这个问题。基本上有三种方法可以实现,其中没有一种方法比简单地将相同的文字列表表达为两个IN()
表达式更容易(恕我直言),所以我通常不建议将它们用于您的用例:
创建并填充一个(可能是临时的)表,您随后将其加入到您的查询中:
CREATE TEMPORARY TABLE vals (x VARCHAR(255) NOT NULL PRIMARY KEY);
INSERT INTO vals VALUES ('bla'), ('blub');
SELECT *
FROM foo
JOIN vals v1 ON v1.x = foo.bar
JOIN vals v2 ON v2.x = foo.anotherField;
使用UNION
从子查询中派生“内联”表:
SELECT *
FROM foo
JOIN (SELECT 'bla' AS x UNION ALL SELECT 'blub') v1 ON v1.x = foo.bar
JOIN (SELECT 'bla' AS x UNION ALL SELECT 'blub') v2 ON v2.x = foo.anotherField;
定义来自同一UNION
的视图,然后加入:
CREATE VIEW vals AS SELECT 'bla' AS x UNION ALL SELECT 'blub';
SELECT *
FROM foo
JOIN vals v1 ON v1.x = foo.bar
JOIN vals v2 ON v2.x = foo.anotherField;
如@Stephan's answer所示,使用MySQL FIND_IN_SET()
函数解决问题也是可能的。然而,这非常依赖于具有特定形式的数据并且不能很好地扩展的“黑客”。
答案 1 :(得分:1)
您可以通过首先准备SQL
声明来完成此操作:
set @param:="'bla', 'blub'";
SET @sql = CONCAT('SELECT * FROM foo WHERE bar IN (', @param, ')
AND anotherField IN (', @param, ')');
PREPARE stmt FROM @sql;
EXECUTE stmt;
答案 2 :(得分:1)
你可以试试这个:
SELECT 'bla, blub' INTO @mstr;
SELECT
*
FROM
foo
WHERE
find_in_set(bar,@mstr)
AND find_in_set(anotherField,@mstr)