我能否在单个语句中多次迭代更新单个列?

3

我有一个表格,作为存储过程的参数传入(它来自于Excel工作簿源,但那是另一个故事)。其中有几列需要将值与每列的有效值列表进行验证。

假设我的表格OriginDetails看起来像这样(请注意,这仅是模拟数据; 我有两个这样的表格,每个表格有8列需要验证) -

Origin   | Status     | Priority | ErrMsg
------------------------------------------
Testing  | In Review  | Low      | 
Design   | Initiated  | Medium   | 
Prod     | Declined   | Critical |           

我正在验证列 OriginStatusPriority 中的值,针对三个不同的列表进行验证(实际上我是根据表中的数据进行验证的,但为了简单起见,在此处我硬编码了这些值),并根据我的验证更新 ErrMsg 列 -

UPDATE OriginDetails 
SET ErrMsg = ErrMsg + '|Invalid Origin' 
WHERE Origin NOT IN ('Pre-Design','Design','Development') 

UPDATE OriginDetails 
SET ErrMsg = ErrMsg + '|Unrecognized Status' 
WHERE Status NOT IN ('In Review','Approved') 

UPDATE OriginDetails 
SET ErrMsg = ErrMsg + '|Priority check failed' 
WHERE Priority NOT IN ('Critical','Medium','High')

这一切都很好,运作良好 - 但是我最终得到了16个这样的更新语句,用于两个表格,因此我有一个非常庞大且难看的代码块(而且由于我几乎为2个表格编写了几乎相同的代码,所以还存在很多重复)。
是否有一种方法可以实际上在每个表格中执行所有更新的单个语句?
类似以下内容的东西,除了它应该执行每个条件而不仅仅是一个 -
UPDATE OriginDetails
SET ErrMsg = ErrMsg + 
(CASE WHEN Origin NOT IN ('Pre-Design','Design','Development') 
           THEN '|Invalid Origin'
      WHEN Status NOT IN ('In Review','Approved') 
           THEN '|Unrecognized Status'
      WHEN Priority NOT IN ('Critical','Medium','High') 
           THEN '|Priority check failed'
END)

欢迎提出任何想法或意见。谢谢!

2个回答

6

类似这样的内容应该能很好地运行(并且只需要您输入值一次):

UPDATE OriginDetails
SET ErrMsg = ErrMsg + 
    CASE WHEN Origin NOT IN ('Pre-Design','Design','Development') THEN '|Invalid Origin' ELSE '' END
    + CASE WHEN Status NOT IN ('In Review','Approved') THEN '|Unrecognized Status'  ELSE '' END
    + CASE WHEN Priority NOT IN ('Critical','Medium','High')  THEN '|Priority check'  ELSE '' END

以下是SQL Fiddle

祝你好运。


1
这个怎么样:
UPDATE OriginDetails
SET ErrMsg = ErrMsg + 
(CASE 
WHEN Origin NOT IN ('Pre-Design','Design','Development') and Status NOT IN ('In Review','Approved') and Priority NOT IN ('Critical','Medium','High') 
           THEN '|Invalid Origin|Unrecognized Status|Priority check failed'
WHEN 
Origin NOT IN ('Pre-Design','Design','Development') and Status NOT IN ('In Review','Approved') and Priority IN ('Critical','Medium','High') 
           THEN '|Invalid Origin|Unrecognized Status'


END)

你可以像我一样添加所有的案例。

这是一个有趣的方法,我会测试一下看看它的效果如何 - 谢谢! - Chait
希望这对你有用,我有一个类似的情况需要更新物料状态,根据质量控制和质量保证的要求。 - user1646111
@AkamOmer -- 随意查看我的回复 -- 这应该有助于您简化事情。祝你好运。 - sgeddes
@sgeddes:谢谢,我明白了,你的答案更简单易懂,对我来说很新鲜(再次感谢)。使用加号与case一起,我会尽快测试。 - user1646111
@AkamOmer - 感谢您的回答,非常感谢您的帮助 - 但我选择了sgeddes的答案,因为它更简单和更短。 - Chait
@ChaithanyaM:我也是 : ),我的逻辑更深,他的更快,并且使用了可用工具,这更好。 - user1646111

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接