【发布时间】:2016-12-12 20:46:14
【问题描述】:
我正在重写我的 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 );
更多细节:-
InputTable( 466K records ) 共有四个字段参与 JOIN 逻辑,总共有 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( 45k records ) 将使用 InputTable 参与 JOIN 逻辑,根据上述标准生成结果集,生成大约 3.51 亿行。
我的输入数据目前只满足两种情况。
输入表:-
NULL,NULL,NULL,NULL - 225776 rows
NOT NULL, NOT NULL, NULL, NULL - 240360 rows
任何意见将不胜感激。谢谢。
【问题讨论】:
-
您在使用 case-when 时发现的性能问题是什么?如果您只想检查 NULL ,您可以很好地使用 coalesce ,就像在其他条件下使用一样...
-
strareabriefnamel2 字段值可以为 NULL 和 NOT NULL。需要考虑这两个条件并在 WHERE 子句中使用它们...
-
但是根据您的示例,您可以只使用 iif...
-
@KannanKandasamy 。 . .虽然我不喜欢
WHERE子句中的CASE,但IIF()更糟糕,因为它不是标准SQL。 -
不,如果 strareabriefnamel2 为 NULL,我实际上是在两边加入空字符串,但是当 strareabriefnamel2 不是 NULL 时,两边会有两个不同的 NOT NULL 值....
标签: sql sql-server tsql case