Оператор IF внутри оператора where в SQL - PullRequest
6 голосов
/ 13 мая 2011

Я разрабатываю приложение календаря.Он хранит время в двух форматах.В таблице есть следующие столбцы title, startDate, startTime.Если пользователь указывает время начала и дату начала.База данных хранит метку времени UNIX (количество секунд с начала эпохи UNIX) в столбце startTime, а startDate - NULL.Если пользователь предоставляет только начальную дату, база данных сохраняет дату в формате nnnn-mm-dd в startDate и NULL в ´startTime`.У меня есть такая структура БД, потому что время по всему миру проще отображать, потому что разные часовые пояса имеют разное летнее время.

Я хочу выбрать события, которые происходят после указанной даты.Клиентский компьютер предоставляет серверу метку времени UNIX на начало этого дня ($unix) и дату ($date) в формате nnnn-mm-dd для выбора правильных дат.

Проблема заключается в том, чтоЯ не знаю, как выбрать те дни, которые происходят, как указано выше.Это решение не применимо для меня, даже если оно работает:

SELECT *
  FROM events
 WHERE startDate >= '$date'
   OR startTime >= '$unix'

Дело в том, что у меня в некоторых строках есть отметка времени unix в startTime, у меня также есть дата в startDate и другая причина, которую я не хочу объяснять.И из-за этого я не могу использовать вышеуказанное решение.

Мне нужно какое-то решение, в котором есть оператор IF внутри предложения Where, например:

SELECT *
  FROM events
 WHERE IF(startTime = NULL, startDate >= '$date', startTime >= '$unix')

Я просто догадываюсьэто решение.Но так ли это?

Ответы [ 6 ]

8 голосов
/ 13 мая 2011
WHERE (startTime IS NULL AND startDate >= '$date')
   OR (startTime IS NOT NULL AND startTime >= '$unix')
4 голосов
/ 13 мая 2011

Все диалекты SQL поддерживают СЛУЧАЙ КОГДА:

SELECT *
 FROM events
WHERE CASE WHEN startTime is null
           THEN startDate >= '$date'
           ELSE startTime >= '$unix'
0 голосов
/ 01 июля 2015

Я знаю, что это старый вопрос, но я думаю, что это лучший способ продолжить ...

SELECT *
FROM events
WHERE IF(startTime IS NULL, '$date', '$unix') =< startDate
0 голосов
/ 13 мая 2011

Я предполагаю, что вы хотите использовать startDate, когда startDate не равно нулю, и startTime, когда startTime не равно нулю ... затем попробуйте это ...


SELECT * 
FROM events
WHERE (startTime is not NULL and startDate >= '$date') 
OR (startTime is not NULL and startTime >= '$unix') 

Вы можете использовать оператор CASEтакже, но это имеет больше смысла, более читабельно.

0 голосов
/ 13 мая 2011
SELECT * 
FROM events 
WHERE 
  (startDate >= '$date' OR startTime >= '$unix')
AND 
  startDate != NULL

Это не вернет ни одной строки, которая имеет нулевое значение для startDate

0 голосов
/ 13 мая 2011

Вам просто нужна некоторая комбинированная логическая логика в предложении WHERE:

SELECT * 
FROM events
WHERE 
    (startDate IS NULL AND startTime >= '$unix') OR
    (startTime IS NULL AND startDate >= '$date')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...