Wie kann ein boolescher Wert in der SQL Select-Anweisung zurückgegeben werden?
Ich habe diesen Code ausprobiert:
SELECT CAST(1 AS BIT) AS Expr1
FROM [User]
WHERE (UserID = 20070022)
Und es wird nur zurückgegeben, TRUE
wenn das UserID
auf dem Tisch vorhanden ist. Ich möchte, dass es zurückkehrt, FALSE
wenn das UserID
nicht auf dem Tisch existiert.
SELECT WHEN CAST(1 AS BIT) THEN 'YES' END AS result
- führt zu einem Fehler, dh esCAST(1 AS BIT)
ist nicht dieselbe logische WAHR.Antworten:
Was Sie dort haben, gibt überhaupt keine Zeile zurück, wenn der Benutzer nicht existiert. Folgendes benötigen Sie:
quelle
1
anstelle von verwenden*
.*
idiomatischer. Siehe diese Frage .AS bool
Teil ist sehr wichtig):CAST( CASE WHEN EXISTS ( SELECT * FROM mytable WHERE mytable.id = 1) THEN TRUE ELSE FALSE END AS bool) AS nameofmycolumn
Möglicherweise etwas in diese Richtung:
http://sqlfiddle.com/#!3/5e555/1
quelle
Da häufig
1 = true
und0 = false
alles, was Sie tun müssen , ist die Anzahl der Zeilen zu zählen, und Umwandlung in einemboolean
.Daher muss für Ihren gebuchten Code nur eine
COUNT()
Funktion hinzugefügt werden:quelle
Exists(
Test ist viel schneller als einCount(1)
Test für Tabellen mit einer großen Anzahl von Zeilen.UserID
jedoch indiziert ist (oder sogar die PK ist), gelangen Sie sicher direkt zu der einen eindeutigen Zeile, die vorhanden ist (oder nicht).Verwenden Sie 'Exists', das entweder 0 oder 1 zurückgibt.
Die Abfrage lautet wie folgt:
quelle
Wenn count (*) = 0 ist, wird false zurückgegeben. Wenn count (*)> 0 ist, wird true zurückgegeben.
quelle
So mach ich es:
Da ein Boolescher Wert niemals null sein kann (zumindest in .NET), sollte er standardmäßig false sein, oder Sie können ihn selbst festlegen, wenn er standardmäßig true ist. Jedoch 1 = wahr, also null = falsch und keine zusätzliche Syntax.
Hinweis: Ich verwende Dapper als Mikro-Orm. Ich würde mir vorstellen, dass ADO genauso funktionieren sollte.
quelle
Beachten Sie ein weiteres gleichwertiges Problem: Erstellen einer SQL-Abfrage, die (1) zurückgibt, wenn die Bedingung erfüllt ist, und ansonsten ein leeres Ergebnis. Beachten Sie, dass eine Lösung für dieses Problem allgemeiner ist und mit den obigen Antworten leicht verwendet werden kann, um die von Ihnen gestellte Frage zu beantworten. Da dieses Problem allgemeiner ist, beweise ich seine Lösung zusätzlich zu den schönen Lösungen, die oben für Ihr Problem vorgestellt wurden.
quelle
Für diejenigen unter Ihnen, die daran interessiert sind, den Wert eines benutzerdefinierten Spaltennamens hinzuzufügen, hat dies für mich funktioniert:
Sie können die doppelten Anführungszeichen aus dem Spaltennamen überspringen, falls Sie nicht daran interessiert sind, die Groß- und Kleinschreibung des Namens beizubehalten (bei einigen Clients).
Ich habe die Antwort von @ Chad darauf leicht angepasst.
quelle
anfangs ist der boolesche Wert isAvailable auf 0 gesetzt
quelle