如何在不同条件的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。它们是嵌套的。主要CASE
的ELSE
是嵌入的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 )
如何在 SQL 的 WHERE CLAUSE 中的 CASE 内添加 sql“BETWEEN”条件