【问题标题】:How to create a user defined variable that can be used in a set expression?如何创建可在集合表达式中使用的用户定义变量?
【发布时间】:2014-01-20 08:44:33
【问题描述】:

我想这样做

set @a =(1,2,3);
select * from mytable where somefield in @a;

但是mysql不喜欢。

我该怎么做?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您可以使用临时表执行此操作,如以下问题所示: How can I simulate an array variable in MySQL?

    或者您可以在这个问题中使用find_in_set()how to set an array as a mysql user variable

    【讨论】:

      【解决方案2】:

      试试这个

      SET @a = '1,2,3';
      SET @sql = CONCAT('SELECT * FROM test WHERE `user` IN(', @a, ')');
      PREPARE stmt FROM @sql;
      EXECUTE stmt;
      

      See Fiddle Demo

      【讨论】:

        【解决方案3】:

        解决这个问题的一种方法

        SET @a = '1,2,3';
        SELECT * 
          FROM mytable 
         WHERE FIND_IN_SET(somefield, @a) > 0;
        

        注意:这将有效地导致全面扫描。


        恕我直言,最好不要使用包含字符串的用户变量

        SELECT * 
          FROM mytable t JOIN
        (
          SELECT 1 somefield UNION ALL
          SELECT 2 UNION ALL
          SELECT 3
        ) q
            ON t.somefield = q.somefield;
        

        另一种选择是利用动态 SQL

        SET @a = '1,2,3';
        SET @sql = CONCAT('SELECT * FROM mytable WHERE somefield IN(', @a, ')');
        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
        

        这里是 SQLFiddle 的所有查询演示

        【讨论】:

          【解决方案4】:

          可以这样做,但使用正确的语法和准备语句,如下所示:

          set @a =1,2,3;
          select * from mytable where somefield in (@a);
          
          
          set @crt=concat("select * from mytable where somefield in ",concat('(',@a,')'),";"); 
          
          prepare smnt from @crt;
          EXECUTE smnt;
          DEALLOCATE PREPARE smnt;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-12-24
            • 2019-08-04
            • 1970-01-01
            相关资源
            最近更新 更多