处理嵌套查询中的NULL值

时间:2019-07-30 08:47:50

标签: mysql sql

嵌套查询返回NULL(t的值),但是我想返回0而不是NULL,所以我添加了大小写条件。但此查询仍返回NULL

select case when t.a is NULL then 0 else t.a end 
from

(select QTIB_REQ_ as a from qb_requisitions_all 
where  QTIB_REQ_ IN ($Req_disabled_WA) 
and CLIENT___BENCH___NON_BILLABLE IN ( 'Non Billable', 'Non-Billable', 'NonBillable') 
and DATEDIFF(CURDATE(),TARGET_FILL_DATE)<30 
and DATEDIFF(CURDATE(),TARGET_FILL_DATE)>0) as t

2 个答案:

答案 0 :(得分:0)

IFNULL()函数使您可以在表达式为NULL的情况下返回替代值。试试这个:

select IFNULL(QTIB_REQ_, 0) as a from qb_requisitions_all 
where  QTIB_REQ_ IN ($Req_disabled_WA) 
and CLIENT___BENCH___NON_BILLABLE IN ( 'Non Billable', 'Non-Billable', 'NonBillable') 
and DATEDIFF(CURDATE(),TARGET_FILL_DATE)<30 
and DATEDIFF(CURDATE(),TARGET_FILL_DATE)>0

答案 1 :(得分:0)

您的子查询不能NULL返回t.a。为什么不?因为您有以下条件:

QTIB_REQ_ IN ($Req_disabled_WA) 

您要返回QTIB_REQ_的值,而NULL的值不能满足此条件。

我可以想到两种可能性。也许您的意思是'NULL',而不是NULL。如果是这样,则逻辑应为:

select (case when t.a is NULL or t.a = 'NULL' then '0 'else t.a end)

但是,这似乎不太可能,因为0表示该值是一个数字。

或者,您确实有一个相关的子查询,但是针对问题将其“简化”了。所以你真的有:

select (select QTIB_REQ_ as a
        from qb_requisitions_all 
        where QTIB_REQ_ IN ($Req_disabled_WA) and
              CLIENT___BENCH___NON_BILLABLE IN ( 'Non Billable', 'Non-Billable', 'NonBillable') and
              DATEDIFF(CURDATE(),TARGET_FILL_DATE) < 30 and 
              DATEDIFF(CURDATE(),TARGET_FILL_DATE) > 0
       ) 

如果是这种情况,则您的问题是子查询没有返回任何行,因此该值被解释为NULL。您可以使用COALESCE()或使用聚合和COALESCE()来解决此问题。因为这最多应该返回一行,所以我会寻求:

select (select coalesce(max(QTIB_REQ_), 0) 
        from qb_requisitions_all 
        where QTIB_REQ_ IN ($Req_disabled_WA) and
              CLIENT___BENCH___NON_BILLABLE IN ( 'Non Billable', 'Non-Billable', 'NonBillable') and
              DATEDIFF(CURDATE(),TARGET_FILL_DATE) < 30 and 
              DATEDIFF(CURDATE(),TARGET_FILL_DATE) > 0
       )