Jak zwrócić wartość logiczną w instrukcji SQL Select?
Wypróbowałem ten kod:
SELECT CAST(1 AS BIT) AS Expr1
FROM [User]
WHERE (UserID = 20070022)
I powraca tylko TRUE
wtedy, gdy UserID
istnieje na stole. Chcę, żeby wrócił, FALSE
jeśli UserID
nie ma go na stole.
SELECT WHEN CAST(1 AS BIT) THEN 'YES' END AS result
- powoduje błąd, tj.CAST(1 AS BIT)
Nie jest tą samą logiczną PRAWDA.Odpowiedzi:
To, co tam masz, nie zwróci żadnego wiersza, jeśli użytkownik nie istnieje. Oto, czego potrzebujesz:
źródło
1
zamiast*
.*
jest bardziej idiomatyczne. Zobacz to pytanie .AS bool
część jest bardzo ważna):CAST( CASE WHEN EXISTS ( SELECT * FROM mytable WHERE mytable.id = 1) THEN TRUE ELSE FALSE END AS bool) AS nameofmycolumn
Prawdopodobnie coś w tym stylu:
http://sqlfiddle.com/#!3/5e555/1
źródło
Biorąc pod uwagę, że często
1 = true
i0 = false
wszystko, co musisz zrobić, to policzyć liczbę wierszy i rzucić naboolean
.Dlatego Twój opublikowany kod wymaga tylko
COUNT()
dodania funkcji:źródło
Exists(
testu jest znacznie szybsze niż wykonanieCount(1)
testu na tabelach z dużą liczbą wierszy.UserID
jest zindeksowana (lub nawet jest PK), z pewnością przechodzisz bezpośrednio do jedynego unikalnego wiersza, który istnieje (lub nie).Użyj „Exists”, który zwraca 0 lub 1.
Zapytanie będzie wyglądać następująco:
źródło
Jeśli count (*) = 0 zwraca false. Jeśli count (*)> 0 zwraca prawdę.
źródło
Robię to tak:
Widząc, że boolean nigdy nie może być zerowy (przynajmniej w .NET), powinien domyślnie mieć wartość false lub możesz ustawić go samodzielnie, jeśli domyślnie jest prawdziwy. Jednak 1 = prawda, więc null = fałsz i bez dodatkowej składni.
Uwaga: używam Dappera jako mojego mikro orma, wyobrażam sobie, że ADO powinno działać tak samo.
źródło
Zwróć uwagę na inny równoważny problem: Tworzenie zapytania SQL, które zwraca (1), jeśli warunek jest spełniony, a pusty wynik w przeciwnym razie. Zauważ, że rozwiązanie tego problemu jest bardziej ogólne i można je łatwo zastosować z powyższymi odpowiedziami, aby uzyskać zadane pytanie. Ponieważ ten problem jest bardziej ogólny, oprócz pięknych rozwiązań przedstawionych powyżej udowadniam jego rozwiązanie.
źródło
Dla tych z Was, którzy są zainteresowani uzyskaniem wartości dodanej niestandardowej nazwy kolumny, zadziałało to:
Możesz pominąć podwójne cudzysłowy w nazwie kolumny na wypadek, gdybyś nie był zainteresowany zachowywaniem wielkości liter w nazwie (w niektórych klientach).
Nieznacznie poprawiłem odpowiedź @ Chad na to.
źródło
początkowo wartość logiczna isAvailable jest ustawiona na 0
źródło