【问题标题】:Run a case when statement and continue evaluating even after earlier conditions are met运行 case when 语句并在满足早期条件后继续评估
【发布时间】:2021-06-08 19:49:31
【问题描述】:

我知道在 SQL Server 的 case when 语句中,当满足第一个 true 条件时,将评估表达式并跳过所有后续的 when 语句。我的问题很简单,即使在第一条语句为真之后,是否有某种方法可以继续评估和修改结果表达式?

例如,假设我在名为 my_column 的列中有一条数据库记录,其字符串值为“ABCDEFG”。我希望能够做这样的事情:

select
    case when my_column like '%A%' then REPLACE(my_column, 'A', 'M') 
         when my_column like '%M%' then REPLACE(my_column, 'M', 'N')
    end as new_column
from my_table

然后我希望我的结果值为'NBCDEFG'

所以本质上我是在尝试将更改从一个 when 语句级联到下一个。

【问题讨论】:

  • case 是一个 expresson 而不是一个 statement 来回答你的问题 - 它不是关于运行代码而是关于返回一个值,一个单一的值.为什么在你描述的情况下你甚至需要一个案例?为什么不直接调用 replace 无条件?
  • 撇开学究不谈,这只是一个玩具示例。在真正的问题中,我试图用一个案例(或类似的东西)替换多个后续的更新语句,这在本质上是如何操作字符串的算法。有第一步、第二步、第三步等,以便根据规范操作字符串。
  • 让您的示例具有代表性。将您的示例归结为要点很好,但是如果它不能代表实际问题,则它没有用(并且会引起无用的答案)。没有像CONTINUE 这样简单的灵丹妙药,根据实际问题,最好的策略很可能是完全重写语句(SQL 就是这样有趣)。
  • CROSS APPLY(VALUES 在这种情况下可能非常有用。 @DaleK 的评论不仅仅是迂腐,这就是你甚至有这样一个问题的原因
  • @DaleK,又名 w3fools...

标签: sql sql-server tsql case


【解决方案1】:

简单地嵌套你的替换

Select REPLACE(REPLACE(my_column, 'A', 'M'),'M','N') new_column
from
my_table

【讨论】:

  • 如果有额外的逻辑需要考虑,可能是一系列 apply() 的案例 - 虽然这不在原始问题中,但目标帖子移动得太快了;-)
  • Yip - 虽然虽然 apply 看起来很漂亮,但它们本质上仍然是嵌套 case 表达式。
猜你喜欢
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
相关资源
最近更新 更多