【问题标题】:A for loop in MYSQL WHERE clause?MYSQL WHERE 子句中的 for 循环?
【发布时间】:2013-01-22 07:19:16
【问题描述】:

是否可以在 WHERE 子句中使用 forloop,例如

SELECT
  name,
  surname,
  id
FROM person
WHERE (while(x < 5)) = id   

那么结果将具有从 1 到 4 的 id。5 可以是值列表或数组。

这可能吗?

ps。这个例子可以通过使用 WHERE 5 > id

来完成

我只是想知道这是否可以通过循环来完成,我将在 jasper 报告中使用这个查询 sn-p

【问题讨论】:

  • 这没有意义。 WHERE 子句用于建立关于结果集中每一行中的列的谓词。你可以通过比较、EXISTSIN 和其他工具来做到这一点。我想不出循环有意义的任何情况。或许如果您能提出一个不是作为普通谓词可重写的示例,我们或许可以提供帮助。如果你想不出这样的例子,这有点说明它是不必要的。

标签: mysql sql


【解决方案1】:

你的意思是这样的:

SELECT name, surname, id 
FROM person
WHERE id in(1, 2, 3, 4);

如果这个数字列表来自一个数组或一个列表,您可以从您的前端应用程序中组成这个列表,或者根据这些值创建一个临时表并 JOIN 带有它的表。

【讨论】:

  • 是的,但是 IN 子句中的值来自列表或数组。?
  • @user1816978 您可以使用来自数组或列表的这些值在您的应用程序中编写此IN 子句,或者使用临时表和JOIN 带有它的表。
【解决方案2】:

你不能使用 WHERE 子句来做到这一点。您需要一个返回值的构造,以便在条件中使用它。

  • WHILE 语句不返回任何内容,它只是一个语句列表。
  • 条件5 &gt; id返回的值可以在WHERE子句中使用。

注意,在存储过程中你可以做这样的事情 -

  DECLARE i INT DEFAULT 0;
  WHILE i < 5 DO
    SELECT * FROM table WHERE id = i;
    SET i = i + 1;
  END WHILE;

...但效率不高。

【讨论】:

    【解决方案3】:

    根据您的评论:

    5 可以有一个值列表或一个数组

    你可能会追求这样的东西:

    select id, name, surname
    from person
    where find_in_set(id, '1,2,3,4') > 0;
    

    SQLFiddle 示例:http://sqlfiddle.com/#!2/7186d/3

    【讨论】:

      【解决方案4】:

      如果您知道要从何处获取数据,则可以使用 BETWEEN 命令。就像下面的命令...

         SELECT name, surname, id FROM person WHERE id BETWEEN 1 AND 5 ;
      

      【讨论】:

        【解决方案5】:

        您可以使用带有这样的 where 条件的简单查询,这正是您所要求的,我的意思是替代循环。这在执行查询时不需要循环,它像循环一样执行

        SELECT
            p.name, 
            p.surname, 
            p.id
        FROM person p
        WHERE p.id < 5  
        

        这将检查id从1到4的记录

        【讨论】:

          猜你喜欢
          • 2015-07-07
          • 1970-01-01
          • 1970-01-01
          • 2013-10-29
          • 1970-01-01
          • 2017-01-25
          • 1970-01-01
          • 2014-10-14
          • 2017-05-21
          相关资源
          最近更新 更多