我正在重写我的SQL以减少执行成本,想知道是否有一种高效的方法来编写以下用于WHERE条件中的CASE WHEN语句:
SELECT l.*,tg.*
FROM RefTable tg,
InputTbl l
WHERE tg.areascheme = l.areascheme
AND tg.countrycode = l.strareabriefnamel1
AND ( CASE WHEN l.strareabriefnamel2 IS NULL THEN '' ELSE tg.areacode END ) = COALESCE( l.strareabriefnamel2,'' )
AND ( CASE WHEN l.strareabriefnamel3 IS NULL THEN '' ELSE tg.subareaname END ) = COALESCE( l.strareabriefnamel3,'' )
AND ( CASE WHEN l.strareabriefnamel4 IS NULL THEN '' ELSE tg.postalname END ) = COALESCE( l.strareabriefnamel4,'' )
option( MAXDOP 0 );
执行计划:
更多细节:
输入表(466K条记录)有四个字段参与连接逻辑,并且有16种可能的(NULL,NOT NULL)组合。
L1, L2, L3, L4
NULL,NULL,NULL,NULL
NULL,NULL,NULL,NOT NULL
NULL,NULL,NOT NULL, NULL
NULL,NULL,NOT NULL,NOT NULL
NULL,NOT NULL,NULL,NULL
NULL,NOT NULL,NULL, NOT NULL
NULL,NOT NULL, NOT NULL,NULL
NULL,NOT NULL,NOT NULL,NOT NULL
NOT NULL,NULL,NULL,NULL
NOT NULL,NULL,NULL,NOT NULL
NOT NULL,NULL,NOT NULL,NULL
NOT NULL,NULL,NOT NULL,NOT NULL
NOT NULL,NOT NULL,NULL,NULL
NOT NULL,NOT NULL,NULL,NOT NULL
NOT NULL,NOT NULL,NOT NULL,NULL
NOT NULL,NOT NULL,NOT NULL,NOT NULL
RefTable( 45000 条记录 ) 将与 InputTable 参与 JOIN 逻辑,根据以上标准生成结果集,产生约 3.51 亿行。
我的输入数据目前只符合两种情况。
InputTable:
NULL,NULL,NULL,NULL - 225776 rows
NOT NULL, NOT NULL, NULL, NULL - 240360 rows
非常感谢您的参与和支持。如果您有任何意见或建议,请不要犹豫,随时提出。谢谢。
WHERE
子句中使用CASE
,但是IIF()
更糟糕,因为它不是标准 SQL。 - Gordon Linoff