2012-04-30 12 views
84

Jak zwrócić wartość boolowską w instrukcji SQL Select?Zwróć wartość logiczną na SQL Wybierz instrukcję

Próbowałem ten kod:

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

i tylko powrócić TRUE wartość, jeśli UserID istnieje na stole. Chcę, aby zwrócono wartość FALSE, jeśli UserID nie istnieje w tabeli. Dziękuję Ci bardzo.

+3

Które dbms? Szczegóły sql różnią się. – joshp

+0

SQL Server nie obsługuje typu Boolean, np. 'WYBIERZ GDY CAST (1 AS BIT) TO" TAK "KONIEC AS wynik" - powoduje błąd, tzn. 'CAST (1 AS BIT)' nie jest tym samym logicznym PRAWDĄ. – onedaywhen

Odpowiedz

168

To, co tam masz, nie zwróci żadnego wiersza, jeśli użytkownik nie istnieje. Oto, co trzeba:

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

dlaczego warto użyć gwiazdki, lepiej jest użyć '1' zamiast' * '. –

+3

@ robertpeter07 - Te dwie są równoważne, ale '*' jest bardziej idiomatyczne. Zobacz [to pytanie] (http://stackoverflow.com/q/1597442/1121833). – Chad

+0

Jeśli używam pętli WHILE, to muszę ją zamknąć w nawiasach klamrowych {} zaraz po "WHILE"? –

14

Ewentualnie coś wzdłuż tych linii:

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

Powoduje zwrócenie ciągu znaków, a nie boolowskiego –

+0

sqlfiddle jest pusta – SpringLearner

+0

Dobrze jest podać nazwę kolumny - SELECT CAST (CASE WHUNT COUNT (*)> 0 THEN 1 ELSE 0 END AS BIT) jako myolumnname FROM manekina WHERE id = 1 –

13

Zważywszy, które powszechnie 1 = true i 0 = false, wszystko co musisz zrobić, to policzyć liczbę wierszy i rzutować na boolean.

Stąd Twój pisał kod musi tylko COUNT() funkcja dodania:

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

Wykonanie testu 'Exist (' jest dużo szybsze niż wykonanie testu 'Count (1)' na tabelach z dużą liczbą wierszy –

+4

Prawdopodobnie Nie zgłaszałem żadnych roszczeń do wydajności w mojej odpowiedzi, tylko minimalna zmiana kodu na Osiągnij to, co chciał OP, ale jeśli kolumna 'ID_użytkownika' jest zindeksowana (lub nawet PK) z pewnością idziesz prosto do jedynego unikalnego wiersza, który istnieje (lub nie). – Stewart

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

Jeśli count (*) = 0 zwraca fałsz. Jeśli count (*)> 0 zwraca true.

0

robię to tak:

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

Widząc jako logiczna nie może być null (przynajmniej w .NET), powinna ona domyślnie false lub można ustawić ją do siebie, czy to zalegających prawda . Jednak 1 = prawda, więc null = false i bez dodatkowej składni.

Uwaga: Używam Dapper jako mojego mikroskopu, wyobrażam sobie, że ADO powinno działać tak samo.

Powiązane problemy