我想编写一个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,所以请看一下。谢谢你的帮助!
答案 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
的第二个参数应该是字符串。BETWEEN
。如果日期具有时间成分,则它将无法按预期工作。