在SQL的where子句中使用IF语句

7
我正在开发一个日历应用程序,它以两种格式存储时间。该表格具有以下列:标题、开始日期、开始时间。如果用户提供了开始时间和开始日期,则数据库会在startTime列中存储UNIX时间戳(自UNIX时代以来的秒数),而startDateNULL。如果用户只提供了开始日期,则数据库会在startDate中以nnnn-mm-dd格式存储日期,并在startTime中存储NULL。我采用这种DB结构,因为这样更容易在世界各地显示时间,不同的时区有不同的夏令时。

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

问题是,我不知道如何选择那些按上述方式发生的日期。即使下面的解决方法可行,但对于我来说也不适用:

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

问题是,有些行提供了Unix时间戳作为startTime,还提供了startDate的日期以及其他我不想解释的原因。因此,我无法使用上面的解决方案。

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

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

我只是猜测这个解决方案,但它是否正确呢?

6个回答

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

6
你永远没有足够的 NULL! ;) - Mitch Wheat
@Woho87:没有两个null。在第一个版本中是这样的,但我在10秒后修复了这个错别字。 - zerkms

7

所有SQL方言都支持CASE WHEN语句:

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

这将不会被优化为使用索引。 - zerkms

0

我假设您想在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

我知道这是一个老问题,但我认为这是最好的处理方式...

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

0

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

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

你确定我们在这两种情况下都需要使用 IS NULL 吗?如果是的话,为什么不将它移出括号呢? - zerkms
@zerkms:不同的变量...我按照海报的要求进行解释,这可能是正确的,也可能是错误的:“数据库在startTime列中存储UNIX时间戳(自UNIX时代以来的秒数),而startDate为NULL。如果用户仅提供起始日期,则数据库将日期以nnnn-mm-dd格式存储在startDate中,并在startTime中存储NULL。 - Mitch Wheat
呵呵,我尝试根据他的“IF”假设编写我的答案... 这表示不同的逻辑 :-S - zerkms

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

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


2
!= NULL 总是被评估为 FALSE - zerkms
1
@Ibu,你要找的是“AND startDate IS NOT NULL”。 - phpguru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接