2010-05-03 130 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) 
相關問題