我有一个查询,看起来像这样:
select *
from foo
where bar in ("bla", "blub")
and anotherField in ("bla", "blub")
是否可以命名 ("bla", "blub")
数组,是否可以在开头不使用 set
来命名它?
最佳答案
MySQL 变量只能保存其原始数据类型。 MySQL 中没有数组这样的东西,也没有在变量中存储多个值的能力。
因此,对您的问题的简短回答是“不,这是不可能的”。但这通常不是什么大问题,因为您的应用程序通常使用更高级的语言构造 SQL,您可以在其中将这样的集合保存在一个变量中:因此可以构建相同的 IN()
从该变量表达而不必在任何显着程度上重复自己。这本质上就是@NikhilButani's answer通过语句准备完成。
也就是说,值的集合可以用SQL 表示:毕竟,这正是表 的含义。因此,您可以通过将您的值存储在表中来解决这个问题。基本上可以通过三种方式来实现,没有一种比简单地将相同的文字列表表达为两个 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
定义一个 View ,然后加入它: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;
也可以使用 MySQL 的 FIND_IN_SET()
函数解决您的问题,如 @Stephan's answer 中所示。 .然而,这在很大程度上是一种“黑客攻击”,它依赖于具有特定形式的数据并且无法很好地扩展。
关于mysql - 没有变量的命名数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22141272/