IF语句在SQL中的where子句中

时间:2011-05-13 04:25:18

标签: mysql sql

我正在开发一个日历应用。它以两种格式存储时间。该表包含以下列title, startDate, startTime。如果用户提供开始时间加上开始日期。数据库在startTime列中存储UNIX时间戳(自UNIX epok以来的秒数),而startDate为NULL。如果用户仅提供开始日期,则数据库将格式nnnn-mm-dd格式存储在startDate中,将NULL格式存储在'startTime`中。我有这种数据库结构,因为它更容易在世界各地显示时间,因为不同的时区有不同的夏令时。

我想选择指定日期之后发生的事件。客户端计算机为服务器提供当天开头的UNIX时间戳($unix)和格式为$date的日期(nnnn-mm-dd)以选择正确的日期。

问题是,我不知道如何选择上面指定的那些日子。此解决方案不适用于我,即使它有效:

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

我在startTime中提供了unix时间戳的某些行,我还有startDate中提供的日期以及我不想解释的其他原因。因此,我无法使用上述解决方案。

我需要某种在Where子句中包含IF语句的解决方案,如:

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

我只是猜测这个解决方案。但这是对的吗?

6 个答案:

答案 0 :(得分:8)

WHERE (startTime IS NULL AND startDate >= '$date')
   OR (startTime IS NOT NULL AND startTime >= '$unix')

答案 1 :(得分:4)

所有SQL方言都支持CASE WHEN:

SELECT *
 FROM events
WHERE CASE WHEN startTime is null
           THEN startDate >= '$date'
           ELSE startTime >= '$unix'

答案 2 :(得分:0)

你只需要WHERE子句中的一些组合布尔逻辑:

SELECT * 
FROM events
WHERE 
    (startDate IS NULL AND startTime >= '$unix') OR
    (startTime IS NULL AND startDate >= '$date')

答案 3 :(得分:0)

SELECT * 
FROM events 
WHERE 
  (startDate >= '$date' OR startTime >= '$unix')
AND 
  startDate != NULL

这不会返回任何具有startDate值为空值的行

答案 4 :(得分:0)

我假设你想在startDate不为null时使用startDate,而在startTime不为null时使用startTime ...然后试试这个......


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

您也可以使用CASE语句,但这更有意义,更具可读性。

答案 5 :(得分:0)

我知道这是一个老问题,但我认为这是继续进行的最佳方式......

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