是否有可能直接选择EXISTS?

时间:2010-05-03 17:03:40

标签: sql sql-server tsql

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

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

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

9 个答案:

答案 0 :(得分:251)

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

如果必须返回条件位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

答案 1 :(得分:46)

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

当你施展到位

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

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

这看起来很相似但如果没有匹配则不给出行(不为零),所以它不是相同的

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

答案 2 :(得分: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

答案 3 :(得分:7)

您可以使用IIFCAST

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

答案 4 :(得分:4)

您还可以执行以下操作:

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

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

答案 5 :(得分:2)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

另一种解决方案是将ISNULLSELECT TOP 1 1一起使用:

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

答案 8 :(得分:-1)

我相信 exists 只能在where子句中使用,所以你必须做一个变通方法(或者将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