可以直接选择EXISTS吗?


185

我想知道是否可以做这样的事情(不起作用):

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

似乎应该可行,但是许多在SQL中应该无法工作的东西;)我已经看到了解决方法(SELECT 1 where ... Exists ...),但似乎我应该能够将存在函数的结果转换为一点并完成它。

Answers:


267

不,您必须使用一种解决方法。

如果必须返回条件位0/1,则另一种方法是:

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

或不使用演员表:

SELECT
   CASE
       WHEN EXISTS( SELECT 1 FROM theTable WHERE theColumn LIKE 'theValue%' )
            THEN 1 
       ELSE 0 
   END

16
如果将结果存储到Bit数据类型中,则不需要强制转换,因为强制转换已经是隐式的。
MikeTeeVee

3
刚刚测试了这项技术,效果很好。从SQL Server 2008 R2测试过的查询中检索结果不需要CAST到BIT。
Tore Aurstad

在我的案例中投也必须删除
塞尔吉奥S.菲略

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

当你投到位

  • 0-> 0
  • 其他一切-> 1
  • 还有NULL-> NULL当然,但是如果没有GROUP BY,则无法使用COUNT(*)获得NULL

bit 直接映射到 boolean即使不是真的,也 .net数据类型。

这看起来很相似,但是如果没有匹配项,则不提供任何行(不为零),因此不一样

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

4
但这根本不使用EXISTS。我不是在问如何解决它,我是可以找到解决方法的,我是在问是否存在一些使用技巧,因为我并不知道。
jcollum 2010年

6
这不是解决方法,而是一种正确的设置方法。存在这种解决方法...而且很干净,不是吗?
gbn

1
@jcollum:是的,或类似的东西。EXISTS几乎总是IF EXISTS或WHERE EXISTS,并且不像您要尝试的那样用于输出
gbn 2010年

14
检查记录是否存在时,EXISTS比COUNT更有效-请参见sqlblog.com/blogs/andrew_kelly/archive/2007/12/15/…–
Tahir Hassan

9
与不同EXISTSCOUNT即使在找到第一个数据后,也会继续在数据中寻找匹配的行,因为它需要计数。
IsmailS 2014年

11

我对此迟到了一点;偶然发现了该职位。但是,这是一个比所选答案更有效,更整洁的解决方案,但应提供相同的功能:

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

7

您可以使用IIFCAST

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

1
我喜欢这个,但是它仅适用于SQL Server 2012及更高版本。好像IIF在2012
ja928

4

您还可以执行以下操作:

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

如果没有以“ theValue”开头的值,则返回null(无记录),而不是位0


2

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


3
@bzlm是的,它可以在SQLServer中使用超过10年。SQL Server 7.0引入了它msdn.microsoft.com/zh-cn/library/aa237157%28SQL.80%29.aspx
Martin Smith,2010年

4
@bzlm-听起来您像个稻草人,对我来说对SQL Server数据类型一无所知。SQL Server中位的定义是“可以取值为1、0或NULL的整数数据类型”。msdn.microsoft.com/zh-CN/library/ms177603.aspx。这适用于列和Transact SQL变量。在SQL中,位变量不能用作布尔值,IF(@TRUE)例如,布尔表达式也不能反之亦然。(例如SET @BitVariable = (1=1)
马丁·史密斯

1
我知道您要去哪里,但要直接投入到EXISTS并不是问题。
jcollum

1

另一个解决方案是ISNULLSELECT TOP 1 1以下项一起使用:

SELECT ISNULL((SELECT TOP 1 1 FROM theTable where theColumn like 'theValue%'), 0)

-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

如果选择的情况下呢?
Lowerkey

-1
SELECT IIF(EXISTS(SELECT * FROM theTable WHERE theColumn LIKE 'theValue%'), 1, 0)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.