mysql - 没有变量的命名数组

标签 mysql arrays

我有一个查询,看起来像这样:

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() 表达式更“容易”(恕我直言),因此我通常不会推荐它们对于您的用例:

  1. 创建并填充一个(可能是临时的)表,您随后将其加入查询:

    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;
    
  2. 使用 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;
    
  3. 从相同的 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/

相关文章:

c# - 对锯齿状字符串数组使用 foreach 循环来显示其中的元素?

mysql - 我将使用什么从大量数据中删除转义的 html

javascript - 重复一个数组,但每次都使用不同的字体属性

arrays - 加入多维数组

mysql - 将 csv 简单导入 MySQL 数据库的问题(加载数据 infile 不起作用)

arrays - 如何在coffeescript中将参数转换为数组?

java - 如何在 java 中编写带组的数组?

html - 使用来自 mysql 数据库的 NodeJs 在 html/js 文件中显示数据

php - 如何通过 php 从 mysql 表中获取所有数据,并打印出每个单元格的内容?

php - laravel5.1 使用 Eloquent 检索不直接相关的嵌套属性