2010-05-03 95 views
144

我想知道是否有可能做这样的事情(不工作):是否可以直接选择EXISTS?

select cast((exists(select * from theTable where theColumn like 'theValue%') as bit)

好像它应该是可行的,但很多事情,应该在SQL工作没有; )我已经看到了这方面的解决方法(SELECT 1 where ... Exists ...),但似乎我应该能够将存在函数的结果作为一点点,并完成它。

回答

208

不,你将不得不使用一种变通方法。

如果必须退回条件比特0/1另一种方式是:

SELECT CAST(
    CASE WHEN EXISTS(SELECT * FROM theTable where theColumn like 'theValue%') THEN 1 
    ELSE 0 
    END 
AS BIT) 
+14

如果要将结果存储到位数据类型,因为该转换已经是隐式的。 – MikeTeeVee 2013-04-08 10:22:21

+1

刚刚测试过这种技术,效果很好。 CAST to BIT不需要从SQL Server 2008 R2测试的查询中检索结果。 – 2015-03-31 09:09:03

+0

在我的情况下,演员必须被删除 – 2018-03-06 17:56:28

2

不,这是不可能的。位数据类型不是布尔数据类型。它是一个整型数据类型,可以是0,1或NULL。

+0

有点不能为空。 :) – bzlm 2010-05-03 17:59:38

+2

@bzlm是的,它可以在SQLServer中使用10年以上。 SQL Server 7.0引入了它http://msdn.microsoft.com/en-us/library/aa237157%28SQL.80%29。aspx – 2010-05-03 18:09:25

+3

@bzlm - 这听起来像是在抓着吸管,并没有真正了解SQL Server数据类型。 SQL Server中位的定义是“可以取值为1,0或NULL的整数数据类型”。 http://msdn.microsoft.com/en-us/library/ms177603.aspx。这适用于列和Transact SQL变量。例如,无论在哪个位置都可以将一个变量用作SQL中的布尔值,例如“IF(@TRUE)”,反之亦然,布尔表达式可以强制为一个位。 (例如'SET @BitVariable =(1 = 1)') – 2010-05-03 20:24:23

41
SELECT CAST(COUNT(*) AS bit) FROM MyTable WHERE theColumn like 'theValue%' 

当你施放到位

  • 0 - > 0
  • 一切 - > 1
  • 和空 - 当然> NULL,但你不能用NULL COUNT (*)没有GROUP BY

bit直接映射到boolean在.net中的数据类型,即使它是不是真的?

这看起来类似,但给人如果没有匹配任何行(不为零),所以它是不一样的

SELECT TOP 1 CAST(NumberKeyCOlumn AS bit) FROM MyTable WHERE theColumn like 'theValue%' 
+3

但是这根本不使用EXISTS。我没有问如何解决它,我可以找到解决方法,我问是否有一些技巧使用存在的位,我不知道。 – jcollum 2010-05-03 17:56:26

+5

这不是一种解决方法,它是一种正确的方式。 EXISTS是这种解决方法...而且很干净,不是吗? – gbn 2010-05-03 17:59:49

+0

所以你说,而不是EXISTS我应该使用此查询?如果是这样,那么是的,这是一个解决方法。 – jcollum 2010-05-03 19:56:26

-1

我相信存在只能在where子句中使用,所以你必须做一个变通方法(或者作为where子句存在的子查询)。我不知道这是否是一个解决方法。

这个什么:

create table table1 (col1 int null) 
go 
select 'no items',CONVERT(bit, (select COUNT(*) from table1)) -- returns 'no items', 0 
go 
insert into table1 (col1) values (1) 
go 
select '1 item',CONVERT(bit, (select COUNT(*) from table1))  --returns '1 item', 1 
go 
insert into table1 (col1) values (2) 
go 
select '2 items',CONVERT(bit, (select COUNT(*) from table1)) --returns '2 items', 1 
go 
insert into table1 (col1) values (3) 
go 
drop table table1 
go 
+0

选择中的情况如何? – lowerkey 2013-02-08 15:45:49

4

你也可以做到以下几点:

SELECT DISTINCT 1 
    FROM theTable 
WHERE theColumn LIKE 'theValue%' 

如果没有启动,没有价值观“theValue”这将返回null(没有记录),而不是位0虽然

9

我对此有点迟了;只是偶然发现了这个帖子。但是这里有一个解决方案,它是更有效&比所选答案整齐,但应给予相同的功能:

declare @t table (name nvarchar(16)) 
declare @b bit 

insert @t select N'Simon Byorg' union select N'Roe Bott' 


select @b = isnull((select top 1 1 from @t where name = N'Simon Byorg'),0) 
select @b whenTrue 

select @b = isnull((select top 1 1 from @t where name = N'Anne Droid'),0) 
select @b whenFalse 
4

您可以使用IIFCAST

SELECT CAST(IIF(EXISTS(SELECT * FROM theTable 
         where theColumn like 'theValue%'), 1, 0) AS BIT) 
+0

我喜欢这个,但它只适用于SQL Server 2012及更高版本。看起来IIF是在2012年添加的 – ja928 2016-09-13 14:41:47

0
SELECT IIF(EXISTS(SELECT * FROM theTable WHERE theColumn LIKE 'theValue%'), 1, 0)