【问题标题】:How to update multiple rows using more than one CASE statement in SQL Server?如何在 SQL Server 中使用多个 CASE 语句更新多行?
【发布时间】:2020-02-14 14:27:15
【问题描述】:

如何使用多个 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-server sql-update case


【解决方案1】:

不要以为你可以用一个案例来产生你想要的结果。 既然世界上的长度是不够的,你怎么知道什么时候只用长度来分割更好地使用字符串比较。

 UPDATE NameToSplit
    SET Aliases = CASE 
                     WHEN  ALIAS LIKE 'core.user%'
                        THEN STUFF(Alias, CHARINDEX('.', Alias) + 5, 0, '-') 
                    WHEN ALIAS LIKE 'core.challenge%'
                        THEN STUFF(Alias, CHARINDEX('.', Alias) + 10, 0, '-') 
                WHEN  ALIAS LIKE 'core.idea%'
                        THEN STUFF(Alias, CHARINDEX('.', Alias) + 5, 0, '-')    
                 -- .....
                 WHEN ALIAS LIKE 'core.%' 
                 THEN ALIAS --keep it at the end
                 END

如果 Alias 只是“core.user”,那么 ELSE 将做的就是工作并且 Aliases = alias

【讨论】:

  • 我不认为我可以这样做,因为我有很多表要重命名,我认为硬编码并不理想,这就是为什么我创建多个 CASE 来“尝试”重命名所有这些都是在同一时间。PS:我是新手,所以我不太了解sql :(
  • 好吧,如果你没有很多不同的别名,它会很快更新。我不明白你说的同时重命名它们,逐行更新您的别名将被重命名
  • 我有很多别名要更新,这里我只是放一些来告诉你我需要不同的情况,因为单词的长度不同,有些有4个like(idea,user),挑战(9),奖励(5),等等......
  • 我明白了,您应该在 .core 之后的 LEN 上使用您的 CASE,而不是 Alias 的总 LEN。我将编辑我的帖子
  • 也许我可以按照你的建议去做,现在唯一的问题是当别名像(core.user)或(core.challenge)时,我得到的别名结果是NULL.... .如何解决这个问题?并提前谢谢你! :)
【解决方案2】:

根据docs,您的ELSE 放错了位置。语法是这样的:

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,

它最终表现得更像 switch 语句,其中后续的 when 语句只有在前面的语句断言为 false 时才会作出断言。

【讨论】:

  • 我现在很困惑。因为我“认为”当字符串太长时,我需要为每个 CASE 语句添加 (-) 来分隔单词...
【解决方案3】:

在我看来,您的问题不在于 CASE 语句。您在这里遇到的主要问题是如何将包含两个或多个单词的字符串拆分为仅两个字符串。

例如,您需要找到一种方法来拆分字符串,如下所示:

usergroup           user group (2 words split into two strings)
userloginhistory    user loginhistory (3 words split into two strings)
challengecategories challenge categories (2 words split into two strings)
activitydetails     activity details (2 words split into two strings)

因此,您需要以某种方式找到一个共同的标准。例如,至少,您需要一个表中所有可能的起始词的列表。在上面的示例中,这些起始词是:userchallengeactivity。这样,您可以编写一些代码在其中一个之后插入破折号。

为了给您提供代码解决方案,如果您可以获取此单词列表,请告诉我(我可能会将它们放在临时表中并从那里使用它们)。

【讨论】:

  • 冈萨雷斯......我明白你在说什么......但是如果我有很多呢??我有很多不同的可能性......
  • 这里的挑战是如何拆分可以包含多个单词的字符串。据我了解,你取第一个单词,然后放一个破折号,然后添加字符串的其余部分,不管它有多少单词。因此,您需要一个“字典”表,您可以在其中找到该“字典”中的每个单词,以查看该单词是否是字符串中的起始单词。一旦找到然后很容易分裂。
  • 您可以在此处阅读有关将无空格字符串拆分为多个单词的更多信息:codeproject.com/Tips/704003/…
  • 不客气。祝你好运!
猜你喜欢
  • 2015-02-27
  • 2014-12-05
  • 2017-03-21
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 2022-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多