SQL查询用于在条件下调用多列

时间:2018-06-26 09:40:21

标签: sql

我想编写一个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-05-01至2018-05-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,所以请看一下。谢谢你的帮助!

3 个答案:

答案 0 :(得分:0)

我不太确定我是否正确,但我认为date列之间的运算符必须为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在注释中建议的,您应将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"
)

答案 1 :(得分:0)

使用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')

答案 2 :(得分:0)

  

四个列(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()的数据库中构造类似的逻辑,但这可以提供帮助。

注意:

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