SQL-запрос для вызова нескольких столбцов с условиями - PullRequest
0 голосов
/ 26 июня 2018

Я хочу написать запрос 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

И я хочу получить строку, где организация - Ikea, и где самая ранняя дата среди четырех столбцов (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")

EDIT :: Теперь я понял, что мне нужно иметь дело со значениями NA, где, если строка содержит NA, я хочу игнорировать NA и видеть самую раннюю дату среди остальных значений. Я создал еще один вопрос для этого, поэтому, пожалуйста, посмотрите. Спасибо за твою помощь!

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

с помощью 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')
0 голосов
/ 26 июня 2018

самая ранняя дата среди четырех столбцов (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 в столбцах даты / времени. Если даты имеют компонент времени, он не будет работать должным образом.
0 голосов
/ 26 июня 2018

Я не совсем уверен, правильно ли я понял, но я думаю, что оператор между столбцами дат должен быть И вместо ИЛИ. Также вы можете использовать оператор 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"
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...