是否可以直接选择EXISTS作为位?

问题描述 投票:0回答:9

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

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

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

sql sql-server t-sql
9个回答
319
投票

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

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

53
投票
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%'

16
投票

您可以使用

IIF
CAST

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

12
投票

我对此的理解有点晚了;刚刚偶然发现了这个帖子。然而,这是一个比所选答案更高效、更简洁的解决方案,但应该提供相同的功能:

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

6
投票

您还可以执行以下操作:

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

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


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

2
投票

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


2
投票

另一种解决方案是将

ISNULL
SELECT TOP 1 1
一起使用:

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

-1
投票

我相信exists只能在where子句中使用,因此您必须采取解决方法(或使用exists作为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
© www.soinside.com 2019 - 2024. All rights reserved.