我想知道是否有可能这样做(这并不管用):

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

似乎它应该是可行的,但很多事情,应该在SQL中工作不;)我已经看到了这种变通方法(SELECT 1,其中…Exists…),但似乎我应该能够仅仅将Exists函数的结果转换为位,并完成它。


当前回答

另一个解决方案是将ISNULL与SELECT TOP 1 1结合使用:

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

其他回答

不,这不可能。位数据类型不是布尔数据类型。整数数据类型,取值为0、1或NULL。

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

当你施放到位时

0 -> 0 其他的-> 1 和NULL -> NULL当然,但你不能得到NULL计数(*)没有一个GROUP BY

位直接映射到。net数据类型中的布尔值,即使它不是真的…

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

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

不行,你得想个变通办法。

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

您还可以执行以下操作:

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

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

我相信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