如何在不同条件的sql server的case语句中插入多个else?

Posted

技术标签:

【中文标题】如何在不同条件的sql server的case语句中插入多个else?【英文标题】:How to insert a multiple else in a case statement in sql server with different conditions? 【发布时间】:2020-03-02 14:37:07 【问题描述】:

我真的很苦恼如何在不同条件下的 case 语句中插入 else...我不确定是语法错误还是什么?它不起作用,我没有任何错误消息,问题是在某些情况下我的别名中仍然有 Null...

    UPDATE Table
    SET Alias = SUBSTRING(Names, 10, 40);

    UPDATE Table
            SET Alias = CASE WHEN  Alias LIKE 'core.user%'  OR Alias LIKE  'core.idea%' OR Alias LIKE'core.form%' 
                             THEN STUFF(Alias, CHARINDEX('.', Alias) + 5, 0, '-') 
                             WHEN  Alias LIKE 'core.badge%'  OR Alias LIKE  'core.award%' OR Alias LIKE 'core.field%' OR Alias LIKE 'core.audit%' OR Alias LIKE 'core.event%'
                             THEN STUFF(Alias, CHARINDEX('.', Alias) + 6, 0, '-')
                             ELSE CASE len(Alias) when charindex('.',Alias) +4 then Alias
                                  ELSE CASE len(Alias)when charindex('.',Alias)+ 5 then Alias
                                        END
                                   END
                         END;

     /*the result for this part is:*/
     Names                                 Alias
     idealink.core.userbadge               core.user-badge
     idealink.core.ideacategories          core.idea-categories
     idealink.core.awardtype               core.award-type        /*till here it's working,but when*/
     idealink.core.user                    NULL        ---I'd like to have (core.user)----
     idealink.core.idea                    NULL        ---I'd like to have (core.idea)----
     idealink.core.award                   NULL        ---I'd like to have (core.award)---- 

     /*I think the problem is here, I'm having Null*/

所有这一切的目的是摆脱idealink,当字符串在核心之后太长时,在单词之间放置一个破折号。 ;但在某些情况下字符串不是那么长,所以我不需要像 (core.user,core.idea,core.award) 之类的破折号,只需去掉idealink即可。

非常感谢你们的帮助。 谢谢

【问题讨论】:

一个CASE 不能有多个ELSE 子句。 ELSE 用于当没有 WHEN 解析为 true 时。 Humpf,你知道我该如何解决这个问题吗?(我是新手).. :( 那些不是多个ELSE 子句,@Larnu。它们是嵌套的。主要CASEELSE 是嵌入的CASE。问题中的(可以说是糟糕的)格式只是使它看起来在语法上无效。 是的,更多的是 OP 似乎暗示他们想要多个 else 用于单个 CASE , @EricBrandt 。 【参考方案1】:

原因是因为 core.user 和 core.userbridge 都属于您为别名定义的条件,例如 'core.user%'

要显式设置 core.user,core.idea,core.award 的值,您可以执行以下操作。

检查/****************/之间的部分

UPDATE Table
    SET Alias = SUBSTRING(Names, 10, 40);

UPDATE Table
   SET Alias = CASE /*****************************************************************************************/
                    WHEN Alias in('core.user','core.idea','core.award')
                    THEN Alias                  
                    /*****************************************************************************************/
                    WHEN Alias LIKE 'core.user%'  OR Alias LIKE  'core.idea%' OR Alias LIKE'core.form%' 
                    THEN STUFF(Alias, CHARINDEX('.', Alias) + 5, 0, '-') 
                    WHEN  Alias LIKE 'core.badge%'  OR Alias LIKE  'core.award%' OR Alias LIKE 'core.field%' OR Alias LIKE 'core.audit%' OR Alias LIKE 'core.event%'
                    THEN STUFF(Alias, CHARINDEX('.', Alias) + 6, 0, '-')
                    ELSE CASE len(Alias) when charindex('.',Alias) +4 then Alias
                         ELSE CASE len(Alias) when charindex('.',Alias)+ 5 then Alias
                               END
                         END
                END;

【讨论】:

天啊,你完全正确@George Joseph,我明白了!非常感谢!! :)

以上是关于如何在不同条件的sql server的case语句中插入多个else?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 的 Where 子句中使用 case 语句

SQL Server判断语句(IF ELSE/CASE WHEN )

case when用法sql

如何在 SQL 的 WHERE CLAUSE 中的 CASE 内添加 sql“BETWEEN”条件

在 SQL Server 中执行嵌套 case 语句逻辑的最佳方法

PL/SQL 中 CASE 语句中的堆栈条件