2009-10-23 73 views
1

我必须创建一个查询来检查几个不同的列,如果其中任何一列有1个,我想返回真实。Sql Server 2000:根据25列中的任何一列为“真”返回“true”或“false”

理想输出将是沿着线:

ID:55
名称:李四
IsDealerType1:真
IsDealerType2:真
IsDealerType3:假
IsDealerType4:假
IsDealerType5:真

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

我试图避免在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 

...但很明显,我不这样做是正确的。

任何帮助表示赞赏。谢谢!

回答

10

我喜欢罗素的,但我要添加为好:

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

油滑。不是我的第一个想法,但我最近发现了这种使用IN。 – 2009-10-23 20:57:44

+0

非常好。为了可能搜索的其他人的利益,此技术也适用于位列上的WHERE子句,但“|”和“OR”不起作用。例如。 (1a,1b,1c,1d)中的1处' – rayzinnz 2016-03-23 01:44:26

5

CASE WHEN(1A + 1B + 1C + 1D)> 0 THEN 1 ELSE 0 END作为IsDealerType1

+0

除了情况1A漂亮很多 当真正 然后真正 别的壳1b真时真那么其他....错误的结束等 – Shawn 2009-10-23 20:47:48

+0

我不知道要检查哪一个,因为他们将所有的工作- 感谢您的快速回复! – Bryan 2009-10-23 21:00:13

+2

在SQL Server中,BIT类型虽然没有'add'操作符,所以1a + 1b会给出错误8117'操作数数据类型位对于添加操作符无效'。这只适用于1a ... 1d以数字(tinyint,smallint,int等)存储的情况,或者需要在每个1a..1d列上进行广告投射。 – 2009-10-23 21:00:44

1

在SQL的BIT类型不能在布尔表达式中使用(D'哦!!),他们需要与整数进行比较:

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 
+0

..但位可以使用按位运算符。请看我的回答 – gbn 2009-10-24 18:56:33

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 
+0

+1我学到了一些新东西 – 2009-10-24 19:30:33

相关问题