根据可能存在于多列中的值消除记录

时间:2017-01-31 16:38:30

标签: sql sql-server

我是SQL的新手(使用Sql Server)。我有一个拥有帐户信息和10列的表,每个列存储各种错误代码。问题是,如果列表中提供的错误代码中至少有一个存在于这10列中的任何一列中,我就需要删除记录。

例如,如果在Column1或Column2或Column3中找到数字98和99,依此类推,那么我想从结果集中排除它们。

具体来说,有人正在将他们的存储过程逻辑转换给我,但据称处理此问题的代码片段没有按照预期的那样做(除非我遗漏了一些明显的东西)。代码在下面,并在where子句中。

Select * From arcu.arcuaccountdetailed ad
Where
(Case
when ad.AccountWarningcode1 IN (98,99,2,29,30,21,10,11,50,53,97) then 1 
when ad.AccountWarningcode2 IN (98,99,2,29,30,21,10,11,50,53,97) then 1
when ad.AccountWarningcode3 IN (98,99,2,29,30,21,10,11,50,53,97) then 1
when ad.AccountWarningcode4 IN (98,99,2,29,30,21,10,11,50,53,97) then 1
when ad.AccountWarningcode5 IN (98,99,2,29,30,21,10,11,50,53,97) then 1
when ad.AccountWarningcode6 IN (98,99,2,29,30,21,10,11,50,53,97) then 1
when ad.AccountWarningcode7 IN (98,99,2,29,30,21,10,11,50,53,97) then 1
when ad.AccountWarningcode8 IN (98,99,2,29,30,21,10,11,50,53,97) then 1
when ad.AccountWarningcode9 IN (98,99,2,29,30,21,10,11,50,53,97) then 1
when ad.AccountWarningcode10 IN (98,99,2,29,30,21,10,11,50,53,97) then 1
when ad.AccountWarningcode11 IN (98,99,2,29,30,21,10,11,50,53,97) then 1
when ad.AccountWarningcode12 IN (98,99,2,29,30,21,10,11,50,53,97) then 1
when ad.AccountWarningcode13 IN (98,99,2,29,30,21,10,11,50,53,97) then 1
when ad.AccountWarningcode14 IN (98,99,2,29,30,21,10,11,50,53,97) then 1
when ad.AccountWarningcode15 IN (98,99,2,29,30,21,10,11,50,53,97) then 1
when ad.AccountWarningcode16 IN (98,99,2,29,30,21,10,11,50,53,97) then 1
when ad.AccountWarningcode17 IN (98,99,2,29,30,21,10,11,50,53,97) then 1
when ad.AccountWarningcode18 IN (98,99,2,29,30,21,10,11,50,53,97) then 1
when ad.AccountWarningcode19 IN (98,99,2,29,30,21,10,11,50,53,97) then 1
when ad.AccountWarningcode20 IN (98,99,2,29,30,21,10,11,50,53,97) then 1
Else 0 End) = 1

我非常感谢任何见解。

1 个答案:

答案 0 :(得分:0)

您应该修复数据!只要表中的列具有数字就足够,数据模型就是可疑的。哦,有时这很有用,但你的问题清楚地表明了为什么这是一个问题。您需要一个单独的表,每行AccountWarningCode一行。

您可以做的一件事是cross apply

的巧妙应用
select ad.*
from arcu.arcuaccountdetailed ad cross apply
     (select max(case when v.AccountWarningCode in  (98, 99, 2, 29, 30, 21, 10, 11, 50, 53, 97) 
                      then 1 else 0
                 end) as flag
      from (values (ad.AccountWarningcode1),
                   (ad.AccountWarningcode2),
                   . . .
           ) v(AccountWarningCode)
     ) awc
where awc.flag = 1

这可能无法解决您的具体问题 - 它会在问题中实现逻辑。但是它应该更好地处理代码并防止在不同部分条件下出现拼写错误。