优化case表达式

2guxujil  于 2021-08-09  发布在  Java
关注(0)|答案(3)|浏览(244)

我有一个长长的清单:

update wi
   SET class
   case
        WHEN wi.column = 'a' THEN (select top 1 from lookup_tbl1  where code = 1)
        WHEN wi.column = 'b' THEN (select top 1 from lookup_tbl1  where code = 2)
        WHEN wi.column = 'c' THEN (select top 1 from lookup_tbl1  where code = 3)
        WHEN wi.column = 'd' THEN (select top 1 from lookup_tbl1  where code = 80)

   end
   SET name
   case
        WHEN wi.column2 = 'Chris' THEN (select top 1 from table1  where code = 1)
        WHEN wi.column2 = 'david' THEN (select top 1 from table1  where code = 2)
        WHEN wi.column2 = 'tan' THEN (select top 1 from table1  where code = 3)
        WHEN wi.column2 = 'drake' THEN (select top 1 from table1  where code = 80)
        WHEN wi.column2 = 'x' THEN ..........

   end
   SET department
   case
        WHEN wi.column3 like 'd.d%' then 'Director D'
        WHEN wi.column3 like '%AC'  then  'Accounting'

   end

FROM transform_tbl wi WHERE flag is null

我在清理table。我需要用实际名称替换缩写,并修复该表中的数据。有没有别的办法或者更好的办法?

koaltpgm

koaltpgm1#

你可以移动 case 到子查询,如下所示:

(
    select top (1) col
    from table1
    where code = case column
        when 'a' then 1
        when 'b' then 2
        when 'c' then 3
        when 'd' then 80
    end
)

笔记:
子查询中缺少实际列的位置 select 条款;我以为 col 进一步的优化可能是可能的,但是您需要向我们展示您的整个查询,并解释它的意图—您可能需要为此提出一个新问题

disho6za

disho6za2#

如果你有索引 table1(code) ,你的方法可能是好的。好吧,这不是因为它在语法上是不正确的。子查询需要选择一些内容。
也就是说,我会重新构造代码,这样在 code 以及 column . 例如, table1 也许应该有识别行的字母。这将大大简化查询:

(select top (1) ? from table1 t1 where t1.letter = ?.column)

case 需要表达。

vlf7wbxs

vlf7wbxs3#

最好的选择是为这个单独的表,可以Map column 值到 code 值,可能带有索引。然后你就可以加入它而不需要复杂的 case 表情。
但如果做不到这一点,可以使用表值构造函数创建Map:

INNER JOIN (VALUES 
    ('a', 1), 
    ('b', 2), 
    ('c', 3),
    ('d', 80),
    ('x', ... )   
) AS map(col, code) ON map.col = [column]
INNER JOIN table1 ON table1.code = map.code

或者,考虑到 top 1 ,您可能需要 apply :

INNER JOIN (VALUES 
    ('a', 1), 
    ('b', 2), 
    ('c', 3),
    ('d', 80),
    ('x', ... )   
) AS map(col, code) ON map.col = column
OUTER APPLY (SELECT TOP 1 ? FROM table1 WHERE table1.code = map.code) t1

但正如在其他答案中所说的,我们需要知道你在找什么栏目。
最后,由于我们没有完整的原始查询,我无法确切地告诉您如何将其与其余代码集成,甚至无法告诉您是否需要 INNER 或者 LEFT 加入。

相关问题