首页 > 解决方案 > 如何在 SQL Server 中使用多个 CASE 语句更新多行?

问题描述

如何使用多个 CASE 更新表中的行?我一直在尝试以不同的方式编写脚本,但我确信语法是错误的。知道错误在哪里吗?

UPDATE NameToSplit
SET Aliases = CASE LEN(Alias)
    WHEN CHARINDEX('.', Alias) + 4 THEN Alias
    ELSE STUFF(Alias, CHARINDEX('.', Alias) + 5, 0, '-')END;
              CASE LEN(Alias)
    WHEN CHARINDEX('.', Alias) + 5 THEN Alias
    ELSE STUFF(Alias, CHARINDEX('.', Alias) + 6, 0, '-')END;
              CASE LEN(Alias)
    WHEN CHARINDEX('.', Alias) + 6 THEN Alias
    ELSE STUFF(Alias, CHARINDEX('.', Alias) + 7, 0, '-')END;
              CASE LEN(Alias)
    WHEN CHARINDEX('.', Alias) + 7 THEN Alias
    ELSE STUFF(Alias, CHARINDEX('.', Alias) + 8, 0, '-')END;
             CASE LEN(Alias)
    WHEN CHARINDEX('.', Alias) + 8 THEN Alias
    ELSE STUFF(Alias, CHARINDEX('.', Alias) + 9, 0, '-')END;
             CASE LEN(Alias)
    WHEN CHARINDEX('.', Alias) + 9 THEN Alias
    ELSE STUFF(Alias, CHARINDEX('.', Alias) + 10, 0, '-')END;

结果必须是这样的:

        Names                              Alias                  Aliases       
    -------------------------------------------------------------------------
    idealink.core.usergroup            core.usergroup         core.user-group
    idealink.core.userloginhistory     core.userloginhistory  core.user-loginhistory
   idealink.core.challengecategories   core.challengecategories core.challenge-categories
   idealink.core.activitydetails       core.activitydetails    core.activity-details

(core.) 之后的单词长度不同,这就是为什么我需要创建不同的案例来获得所有这些。

标签: sql-serversql-updatecase

解决方案


Per the docs, you have your ELSE in the wrong spot. The syntax would be like this:

CASE ProductLine  
  WHEN 'R' THEN 'Road'  
  WHEN 'M' THEN 'Mountain'  
  WHEN 'T' THEN 'Touring'  
  WHEN 'S' THEN 'Other sale items'  
  ELSE 'Not for sale'  
END,

It ends up acting more like a switch statement where the subsequent when statements will only make an assertion if the previous statements have asserted false.


推荐阅读