SQL查询TYPE字段NULL问题求助:FINE_ID为空时默认赋值legislative court
问题原因
当c.FINE_ID为NULL时,子查询的WHERE c.FINE_ID = FINE_ID条件等价于NULL = FINE_ID,SQL中NULL与任何值比较的结果都是UNKNOWN,因此子查询不会返回任何行,最终TYPE字段直接取NULL,子查询内部的CASE语句根本不会执行,这就是你遇到的问题。
解决方案
有两种简洁的修复方式:
方式1:用ISNULL/COALESCE包裹子查询
直接在子查询外层用ISNULL(适用于SQL Server)或COALESCE(通用SQL标准),当子查询返回NULL时,自动替换为'legislative court':
SELECT c.COURT_ID, ci.BODY_TEXT, TYPE = ISNULL( ( SELECT CASE WHEN DESCRIPTION = 'Courts of Appeals' THEN 'appellate court' WHEN DESCRIPTION = 'District Courts' THEN 'special trial court' ELSE DESCRIPTION END FROM [STAGING].COURT_LOCATION WHERE c.FINE_ID = FINE_ID ), 'legislative court' ) FROM [STAGING].[COURT] c LEFT OUTER JOIN [STAGING].COURT_INFO ci ON c.COURT_ID = ci.COURT_ID
方式2:改用LEFT JOIN替代子查询
这种方式逻辑更直观,还能避免子查询可能带来的性能问题:
SELECT c.COURT_ID, ci.BODY_TEXT, TYPE = CASE WHEN cl.DESCRIPTION = 'Courts of Appeals' THEN 'appellate court' WHEN cl.DESCRIPTION = 'District Courts' THEN 'special trial court' WHEN cl.DESCRIPTION IS NULL OR c.FINE_ID IS NULL THEN 'legislative court' ELSE cl.DESCRIPTION END FROM [STAGING].[COURT] c LEFT OUTER JOIN [STAGING].COURT_INFO ci ON c.COURT_ID = ci.COURT_ID LEFT JOIN [STAGING].COURT_LOCATION cl ON c.FINE_ID = cl.FINE_ID
说明
方式2中,LEFT JOIN会保留COURT表的所有行,即使没有匹配的COURT_LOCATION记录(此时cl.DESCRIPTION为NULL),CASE语句能正常捕获这种情况并设置默认值,完美满足你的需求。
内容的提问来源于stack exchange,提问作者SkyeBoniwell
相关产品推荐
相关产品推荐

