首页 > 解决方案 > 使用条件调用多列的 SQL 查询(带 NA)

问题描述

这是我上一个问题的一个连续问题。我想编写一个 SQL 查询来调用具有条件的几个列。我正在使用 RMySQL 包在 R Studio 上工作。我的服务器是 MySQL。

桌子看起来像这样。

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          NA   
Orange       2018-04-02  2018-05-01  2018-07-08  2018-05-26 
Ikea         2018-06-02  2018-05-01          NA  2018-05-26
Nestle       2018-06-02  2018-05-01          NA  2018-05-26
Ikea                 NA  2018-05-05  2018-04-02  2018-06-01

我想得到一个组织是宜家的行,并且四列(A、B、C、D)中最早的日期在 2018-05-01 和 2018-05-31 之间。

在包含 NA 值的一行中,我想忽略 NA 并查看其余值中最早的日期。例如,对于第二行,最早的日期是“2018-05-03”(B 列),因此它符合条件。

因此,只有上面原始表格的第二行第四行符合条件。我想要得到的结果应该是:

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

我应该如何编写 SQL 查询?这是我从上一个问题得到答案后的尝试,但它不适用于具有 NA 的行。

SELECT * FROM myTable 
WHERE organisation LIKE Ikea
LEAST(A, B, C, D) >= '2018-05-01' AND
LEAST(A, B, C, D) < '2018-06-01'

感谢您的任何帮助!

标签: mysqlsqlrconditional-statementsrmysql

解决方案


您可以尝试使用IFNULL()这些值并使用getdate(),因此如果它为 null,它将仅在今天使用,然后不会被认为是最少的,这基本上会忽略它们。

喜欢:LEAST(IFNULL(A,getdate()), IFNULL(B,getdate()), IFNULL(C,getdate()), IFNULL(D,getdate()))

希望这可能会将您推向正确的方向

除非NA那里有一个字符串,您可以使用类似的 case 语句case when A = 'NA' THEN getdate() end

最终可能看起来像

SELECT * FROM myTable 
WHERE organisation LIKE Ikea
LEAST(IFNULL(A,getdate()), IFNULL(B,getdate()), IFNULL(C,getdate()), IFNULL(D,getdate())) >= '2018-05-01' AND
LEAST(IFNULL(A,getdate()), IFNULL(B,getdate()), IFNULL(C,getdate()), IFNULL(D,getdate())) < '2018-06-01'

或者

SELECT * FROM myTable 
WHERE organisation LIKE Ikea
LEAST(case when A = 'NA' THEN getdate() else A end, case when B = 'NA' THEN getdate() else B end, case when C = 'NA' THEN getdate() else C end, case when D = 'NA' THEN getdate() else D end) >= '2018-05-01' AND
LEAST(case when A = 'NA' THEN getdate() else A end, case when B = 'NA' THEN getdate() else B end, case when C = 'NA' THEN getdate() else C end, case when D = 'NA' THEN getdate() else D end) < '2018-06-01'

推荐阅读