By Frank Kalis
BOOLEAN Werte sind nicht für jedermann intuitiv. Hier ist ein netter Trick, um 0 und 1 etwas verständlicher zu machen.
Mal angenommen, wir speichern Daten in unserer Tabelle, die logische Informationen repräsentierten und wollen nun das Ergebnis einer Abfrage jemandem geben, der nicht tagtäglich mit Computern arbeitet und deshalb nicht so firm in der Interpretation von 0 und 1 ist. Gut, normalerweise würde man natürlich sagen, dies ist die Aufgabe einer Präsentationsschicht, was aber machen, wenn jemand zu Einem kommt, und dringend um sofortige Hilfe bittet? Hier ist ein netter Trick, diesem Jemand zu helfen:
CREATE TABLE MyBits ( id INT IDENTITY(1,1) PRIMARY KEY , bool BIT ) GO INSERT INTO MyBits SELECT 0 UNION ALL SELECT 1 GO SELECT id , bool , SUBSTRING('YesNo', 4 - 3 * bool, 3) as YesNo FROM MyBits GO DROP TABLE MyBits id bool YesNo ----------- ---- ----- 1 0 No 2 1 Yes (2 row(s) affected)
Wie funktioniert dies nun?
Nun, der eigentliche Trick passiert innerhalb der SUBSTRING Funktion, wenn wir den Startwert für 'YesNo' kalkulieren. Ist der Wert in der Spalte "bool" eine 0 sieht die Kalkulation innerhalb SUBSTRING folgendermassen aus: SUBSTRING('YesNo', 4 - 3 * bool, 3). Das wird zu SUBSTRING('YesNo, 4 - 0, 3) was korrekterweise 'No' zurückgibt. Wir nutzen hier eine weitere Eigenschaft von SUBSTRING. Ist der String, der zurückgegeben werden soll, kürzer, als im Länge Parameter spezifiziert, gibt SUBSTRING diesen kürzeren Wert zurück, ohne den String bis zur angeforderten Länge mit irgendwelchen Füllzeichen aufzufüllen. Ist der Wert in der Spalte "bool" eine 1 sieht die Kalkulation so aus: SUBSTRING('YesNo', 4 - 3 * 1, 3), was zu SUBSTRING('YesNo', 1, 3) wird und damit 'Yes' zurückgibt.
Last, but not least, hat dieser Jemand, dem wir das Ergebnis der Abfrage aushändigen wollen, nicht nur Schwierigkeiten mit der korrekten Interpretation von 0 und 1, sondern auch zusätzlich noch mit dem Englischen, kann man weitere Dienstleistung erbringen, indem man diesen Trick eindeutscht. So, etwa:
SELECT id , bool , SUBSTRING('NeinJa', 5 - 4 * ~bool, 4) as JaNein FROM MyBits id bool JaNein ----------- ---- ------ 1 0 Nein 2 1 Ja (2 row(s) affected)
Allerdings muß man hierbei aufpassen, daß ~bool nur mit Spalten vom Datentyp BIT funktioniert. Verwendet man TINYINT o.ä. erhält man einen leeren String zurück. In diesem Fall kann man, wenn man will, eine kleine Gedächtnisstütze einbauen:
SELECT id , bool , SUBSTRING('YesNo', 4 - 3 * bool, 3) as YesNo , 'Yes = Ja, No = Nein' AS Erklärung FROM MyBits id bool YesNo Erklärung ----------- ---- ----- ------------------- 1 0 No Yes = Ja, No = Nein 2 1 Yes Yes = Ja, No = Nein (2 row(s) affected)