【问题标题】:SQL query for calling multiple columns with conditions使用条件调用多列的 SQL 查询
【发布时间】:2018-06-26 20:42:32
【问题描述】:

我想编写一个 SQL 查询来调用多个带有条件的列。 表格如下所示。

organisation          A           B          C           D
Ikea         2018-04-01  2018-05-07  2018-05-09  2018-05-01
Ikea         2018-06-01  2018-05-03  2018-05-29  2018-07-01   
Orange       2018-04-02  2018-05-01  2018-07-08  2018-05-26 
Ikea         2018-06-02  2018-05-01  2018-07-08  2018-05-26
Nestle       2018-06-02  2018-05-01  2018-07-08  2018-05-26
Ikea         2018-05-04  2018-05-05  2018-04-02  2018-06-01

我想得到一行,其中组织是宜家,四列(A、B、C、D)中最早的日期在 2018 年 5 月 1 日和 2018 年 5 月 31 日之间。因此,只有上面原始表格的第二第四行符合条件。

所以我想要得到的结果应该是:

organisation          A           B          C           D
Ikea         2018-06-01  2018-05-03  2018-05-29  2018-07-01    
Ikea         2018-06-02  2018-05-01  2018-07-08  2018-05-26

我应该如何编写 SQL 查询? 这是我的尝试,但它不起作用。

SELECT * FROM myTable 
WHERE organisation LIKE Ikea 
AND (A >= "2018-05-01" AND A <= "2018-05-31") 
OR (B >= "2018-05-01" AND B <= "2018-05-31") 
OR (C >= "2018-05-01" AND C <= "2018-05-31") 
OR (D >= "2018-05-01" AND D <= "2018-05-31")

编辑:: 现在我意识到我需要处理 NA 值,如果一行包含 NA,我想忽略 NA 并查看其余值中的最早日期。我为此创建了another question,所以请看一下。谢谢你的帮助!

【问题讨论】:

  • AND 的优先级通常高于OR,所以您可能需要的是... Ikea AND (... OR ... OR ... OR ...)。否则被视为(... Ikea AND ...) OR ... OR ... OR ...
  • 我认为您的结果将是第 1 行和第 4 行
  • 您使用的是哪个DBMS product? “SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您使用的数据库产品添加tag postgresql, oracle, sql-server, db2, ...
  • 我正在使用 MySQL 服务器。

标签: sql


【解决方案1】:

四列(A、B、C、D)中最早的日期在 2018-05-01 和 2018-05-31 之间。

大多数数据库都支持least() 函数,因此您似乎想要:

SELECT t.*
FROM myTable t
WHERE t.organisation LIKE 'Ikea' AND
      LEAST(a, b, c, d) >= '2018-05-01' AND
      LEAST(a, b, c, d) < '2018-06-01';

您可以在不支持 LEAST() 的数据库中构造类似的逻辑,但这会提供 ide。

注意事项:

  • LIKE 的第二个参数应该是一个字符串。
  • SQL 中字符串和日期常量的标准分隔符是单引号,而不是双引号。
  • 我不建议在日期/时间列上使用BETWEEN。如果日期包含时间部分,则它不会按预期工作。

【讨论】:

  • 感谢您的帮助。这看起来是一个很好的解决方案,但不幸的是它没有返回所需的表。我正在使用 MySQL 服务器,实际上我正在使用 R Studio。
  • 好的,现在我知道为什么它不起作用了。我需要考虑表中有 NA 。我会问另一个关于这个的问题。但是现在你的答案似乎最接近我想要的输出!非常感谢。
【解决方案2】:

我不太确定我是否正确,但我认为日期列之间的运算符必须是 AND 而不是 OR。您也可以使用 BETWEEN 运算符来检查日期是否包含在时间跨度中:

SELECT * FROM myTable 
WHERE organisation LIKE Ikea 
AND A BETWEEN "2018-05-01" AND "2018-05-31" 
AND B BETWEEN "2018-05-01" AND "2018-05-31" 
AND C BETWEEN "2018-05-01" AND "2018-05-31" 
AND D BETWEEN "2018-05-01" AND "2018-05-31"

或者正如@Roman 在 cmets 中建议的那样,您应该将 OR 条件分组为

SELECT * FROM myTable 
WHERE organisation LIKE Ikea 
AND (
    A BETWEEN "2018-05-01" AND "2018-05-31" 
 OR B BETWEEN "2018-05-01" AND "2018-05-31" 
 OR C BETWEEN "2018-05-01" AND "2018-05-31" 
 OR D BETWEEN "2018-05-01" AND "2018-05-31"
)

【讨论】:

    【解决方案3】:

    使用 Mysql Query 会像下面这样

     select * from myTable
        where organisation='Ikea'
    and LEAST(A,B,C,D)>= date('2018-05-01') 
    and LEAST(A,B,C,D) < date('2018-06-01')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-26
      • 2019-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 2011-09-18
      相关资源
      最近更新 更多