Sql Server 2000:根据25列中的任何一列返回“true”或“false”为“true”

时间:2009-10-23 20:44:14

标签: sql sql-server tsql sql-server-2000 bit-manipulation

我必须创建一个检查多个不同列的查询,如果其中任何一个有1,我想返回true。

理想的输出将是:

ID:55
姓名:John Doe
IsDealerType1:真
IsDealerType2:真
IsDealerType3:假
IsDealerType4:假
IsDealerType5:True

问题是,我有大约20个名为1a,1b,1c,1d等的列,而不是那5个经销商列。如果任何“1”列为真,那么IsDealerType1应该为真。

我试图避免在VB.NET代码中写一些东西来检查每一列,只是因为在SQL中应该很容易避免这种简单的丑陋 - 只要我知道怎么做 - 但我是不确定如何构造查询。我一直在尝试像...这样的东西。

SELECT id, 
      name, 
      (1a or 1b or 1c or 1d) as IsDealerType1, 
      (2a or 2b or 2c or 2d) as IsDealerType2 
where id = 55

......但显然,我做得不对。

感谢任何帮助。谢谢!

4 个答案:

答案 0 :(得分:10)

我喜欢罗素,但我也会加上这个:

CASE WHEN 1 IN (1a,1b,1c,1d) THEN 1 ELSE 0 END As IsDealerType1

答案 1 :(得分:5)

情况(1a + 1b + 1c + 1d)> 0 THEN 1 ELSE 0 END为IsDealerType1

答案 2 :(得分:2)

使用SQL bitwise OR运算符。避免比较和演员表。

示例:Joel的答案将整数1或0传递给客户端,在那里你可以期待bit(boolean)。 Remus的答案需要演员和比较。

SELECT id, 
      name, 
      (1a | 1b | 1c | 1d) as IsDealerType1, 
      (2a | 2b | 2c | 2d) as IsDealerType2 
where id = 55

答案 3 :(得分:1)

在SQL中,BIT类型不能在布尔表达式中使用(d'oh !!),它们需要与int进行比较:

SELECT id, name, 
   cast(
    case when ([1a]=1 or [1b]=1 or [1c]=1 or [1d]=1) then 1 else 0 end
    as bit) as IsDealerType1,
    cast(case when ([2a]=1 or [2b]=1 or [2c]=1 or [2d]=1) then 1 else 0 end
    as bit) as IsDealerType2 
from [table]
where id = 55