在SQL(Tsql)中,检查互斥选项的好方法是正确的

时间:2012-03-21 15:16:20

标签: sql sql-server-2008

编辑:对不信的人说道歉,我道歉,试图简洁,我省略说桌子的设计不在我的控制之下;此表是我们从其他供应商处收到的数据的“转储”,我必须将其从格式转换为我们的格式。我需要查询的原因是要确定数据是否与代码的其他部分中的假设一致。建议寻找连接字符串的长度或完全匹配的解决方案比我对我所描述的问题的查询要好。

我对我的问题有一对工作查询,但我想知道是否有更漂亮的东西。 taxidflag1taxidflag2taxidflag3中的一个应该在每行填充*。所以我确认他们都有两个空白和一个*这样的。所有字段都不可为空。

select * from acct where 2 <>
(case when taxidFlag1 <> '' then 1 else 0 end) + 
(case when taxidFlag2 <> '' then 1 else 0 end) +
(case when taxidFlag3 <> '' then 1 else 0 end) 

select * from acct where 1 <>
(case when taxidFlag1 = '*' then 1 else 0 end) + 
(case when taxidFlag2 = '*' then 1 else 0 end) +
(case when taxidFlag3 = '*' then 1 else 0 end) 

2 个答案:

答案 0 :(得分:3)

你可以这样做:

select * from acct where taxidFlag1 + taxidFlag2 + taxidFlag3 = '*';

如果两个为空('')且一个为星号(*),则此条件为真。

答案 1 :(得分:1)

select *
from
  acct a1
where
  (select count(*) from acct unpivot (foo for taxidFlag in (taxidFlag1, taxidFlag2, taxidFlag3)) as unp where unp.row_id = a1.row_id and foo = '*') <> 1
;

其中row_id是您的主要关键字段。