没有变量的命名数组

时间:2014-03-03 07:47:20

标签: mysql arrays

我有一个查询,如下所示:

select *
from foo
where bar in ("bla", "blub")
and anotherField in ("bla", "blub")

是否可以为("bla", "blub")数组命名,是否可以在不使用set的情况下对其进行命名?

3 个答案:

答案 0 :(得分:2)

MySQL变量只能保存其原始数据类型。 MySQL中没有数组,也没有能够在变量中存储多个值。

所以,对你的问题的简短回答是“不,这是不可能的”。但这通常不是什么大问题,因为您的应用程序通常使用更高级别的语言构造SQL,在这种语言中您可以将这样的集合保存在变量中:因此可以从该变量构建相同的IN()表达式不得不在很大程度上重复自己。这基本上是@NikhilButani's answer通过语句准备完成的。

也就是说,值的集合可以在SQL中表示:毕竟,这正是 tables 的含义。因此,可以通过将值存储在表中来解决这个问题。基本上有三种方法可以实现,其中没有一种方法比简单地将相同的文字列表表达为两个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的视图,然后加入:

    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;
    
  4. @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)