我是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
我非常感谢任何见解。
答案 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
这可能无法解决您的具体问题 - 它会在问题中实现逻辑。但是它应该更好地处理代码并防止在不同部分条件下出现拼写错误。