2012-04-30 71 views
84

如何在SQL Select語句上返回布爾值?在SQL選擇語句上返回布爾值

我試過這段代碼:

SELECT CAST(1 AS BIT) AS Expr1 
FROM [User] 
WHERE (UserID = 20070022) 

且僅當在表中存在UserID返回TRUE值。如果表格中不存在UserID,我希望它返回FALSE值。非常感謝你。

+3

哪個dbms? sql的細節不同。 – joshp

+0

SQL Server不支持布爾類型例如'選擇何時CAST(1 AS BIT)然後'YES'END AS result' - 會導致錯誤,即CAST(1 AS BIT)'不是相同的邏輯TRUE。 – onedaywhen

回答

168

如果用戶不存在,那麼您在那裏將會返回任何行。這裏有您需要什麼:

SELECT CASE WHEN EXISTS (
    SELECT * 
    FROM [User] 
    WHERE UserID = 20070022 
) 
THEN CAST(1 AS BIT) 
ELSE CAST(0 AS BIT) END 
+1

爲什麼使用星號,最好是用'1'而不是'*'。 – 2015-03-13 06:04:27

+3

@ robertpeter07 - 兩者是等價的,但'*'更具慣用性。看[這個問題](http://stackoverflow.com/q/1597442/1121833)。 – Chad

+0

如果在WHILE循環上使用,我必須在「WHILE」之後緊跟在括號{}之後嗎? –

14

可能沿着這些路線的東西:

SELECT CAST(CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END AS BIT) 
FROM dummy WHERE id = 1; 

http://sqlfiddle.com/#!3/5e555/1

+6

這將返回一個字符串,而不是布爾型 –

+0

sqlfiddle爲空 – SpringLearner

+0

這是一個很好的做法,包括列名 - SELECT CAST(CASE當COUNT(*)> 0 THEN 1 ELSE 0 END AS BIT)作爲mycolumnname FROM dummy WHERE id = 1 –

13

鑑於普遍1 = true0 = false,所有你需要做的是計算行數,並投到boolean

因此,您發佈的代碼只需要一個COUNT()功能補充說:

SELECT CAST(COUNT(1) AS BIT) AS Expr1 
FROM [User] 
WHERE (UserID = 20070022) 
+5

做'存在'('測試要比對大量行進行'Count(1)'測試要快得多 –

+4

也許我在答案中沒有聲明性能,只是最小的代碼更改實現OP想要的東西,但是,如果列'UserID'被索引(或者甚至是PK),你肯定會直接找到存在(或不存在)的唯一行。 – Stewart

4
select CAST(COUNT(*) AS BIT) FROM [User] WHERE (UserID = 20070022) 

如果count(*)= 0返回false。如果count(*)> 0返回true。

0

我不喜歡這樣寫道:

SELECT 1 FROM [dbo].[User] WHERE UserID = 20070022 

看到作爲一個布爾不能爲空(在.NET中至少),它應該默認爲false,也可以將其設置爲自己,如果它的默認真。但是1 = true,所以null = false,並且沒有額外的語法。

注意:我使用Dapper作爲我的微型ORM,我想ADO應該工作一樣。