如何编写SQL语句查询notis表中符合指定日期条件的数据?
需求实现与SQL修正
问题描述
我有一张名为notis的表,字段包括nomborFail(主键,varchar类型)、tarikhNotis2(date类型)、tarikhNotis3(date类型)和status(varchar类型)。需要查询满足以下条件的数据:
- 当
tarikhNotis3不为空时,当前日期晚于tarikhNotis2且早于tarikhNotis3; - 当
tarikhNotis3为空时,当前日期晚于tarikhNotis2,同时status为'BELUM SELESAI'。
用户尝试的SQL
用户最初编写的SQL语句:
SELECT * FROM notis WHERE ((CURRENT_DATE() > tarikhNotis2 AND tarikhNotis3=NULL) OR (CURRENT_DATE() > tarikhNotis2 AND CURRENT_DATE() < tarikhNotis3)) AND status='BELUM SELESAI'
问题分析与修正
你的需求完全可以实现,原SQL存在两处错误:
- 空值判断错误:SQL中判断字段是否为空必须使用
IS NULL,而非=NULL,因为NULL不属于任何常规值,无法通过普通比较运算符匹配; - 条件范围错误:原语句将
status='BELUM SELESAI'设为全局条件,但根据需求,该状态限制仅适用于tarikhNotis3为空的场景,原写法会导致tarikhNotis3不为空时也强制要求状态为'BELUM SELESAI',不符合需求逻辑。
修正后的SQL
SELECT * FROM notis WHERE ( -- tarikhNotis3不为空时的判断逻辑 (tarikhNotis3 IS NOT NULL AND CURRENT_DATE() > tarikhNotis2 AND CURRENT_DATE() < tarikhNotis3) OR -- tarikhNotis3为空时的判断逻辑 (tarikhNotis3 IS NULL AND CURRENT_DATE() > tarikhNotis2 AND status = 'BELUM SELESAI') )
修正说明
- 用
IS NOT NULL和IS NULL正确识别tarikhNotis3的空值状态; - 将
status='BELUM SELESAI'限定在tarikhNotis3 IS NULL的分支内,精准匹配需求; - 两个分支通过
OR连接,分别覆盖两种场景的查询条件。
内容的提问来源于stack exchange,提问作者Kucen
相关产品推荐
相关产品推荐

