Boolesche Behandlung
Access scheint die Logik zu verwenden, dass bei 2 Booleschen
- Beide müssen true sein, um true zurückzugeben
- Entweder false gibt false zurück (unabhängig von Nullen)
- Andernfalls wird null zurückgegeben.
Ich bin nicht sicher, ob andere DBMS (Oracle, DB2, PostgreSQL) so mit bool+null umgehen, aber diese Antwort basiert auf der Access-Bestimmung (MySQL und SQLite stimmen überein). Die Ergebnistabelle ist unten dargestellt.
X Y A.X AND B.Y
0 0 0
0 -1 0
0 (null) 0
-1 0 0
-1 -1 -1
-1 (null) (null)
(null) 0 0
(null) -1 (null)
(null) (null) (null)
SQL Server-Hilfe 1: Funktion für booleschen Wert aus einem beliebigen "Einzelwert"
In SQL Server im Allgemeinen füllt diese Funktion die Lücke für die fehlende any value as boolean
Funktionalität. Sie gibt ein ternäres Ergebnis zurück, entweder 1/0/null - 1 und 0 sind das SQL Server-Äquivalent von true/false (ohne tatsächlich boolesch zu sein).
drop function dbo.BoolFromAny
GO
create function dbo.BoolFromAny(@v varchar(max)) returns bit as
begin
return (case
when @v is null then null
when isnumeric(@v) = 1 and @v like '[0-9]%' and (@v * 1.0 = 0) then 0
else 1 end)
end
GO
Hinweis: Ausgehend von Access wird nur der numerische Wert 0 als FALSE ausgewertet. Dazu werden einige SQL Server-Tricks verwendet
- alles ist in varchar konvertierbar. Daher ist nur eine Funktion erforderlich, die eine varchar-Eingabe benötigt.
- isnumeric ist nicht umfassend, '.' liefert 1 für
isnumeric
aber scheitert an @v * 1.0
so dass ein expliziter Test auf LIKE
[0-9]%`` ist erforderlich, um isnumerisch zu "reparieren".
@v * 1.0
ist erforderlich, um einige arithmetische Probleme zu überwinden. Wenn Sie die Zeichenkette "1" ohne *1.0 an die Funktion übergeben, wird sie bombardiert
Jetzt können wir die Funktion testen.
select dbo.BoolFromAny('abc')
select dbo.BoolFromAny(1)
select dbo.BoolFromAny(0) -- the only false
select dbo.BoolFromAny(0.1)
select dbo.BoolFromAny(-1)
select dbo.BoolFromAny('')
select dbo.BoolFromAny('.')
select dbo.BoolFromAny(null) -- the only null
Sie können es jetzt sicher in einer Abfrage gegen JEDE EINZELNE SPALTE verwenden, wie zum Beispiel
SELECT dbo.BoolFromAny(X) = 1
SQL Server-Helfer 2: Funktion zur Rückgabe des Ergebnisses von BOOL AND BOOL
Der nächste Teil ist die Erstellung der gleichen Wahrheitstabelle in SQL Server. Diese Abfrage zeigt Ihnen, wie zwei Bit-Spalten und die einfache CASE-Anweisung zusammenwirken, um dieselbe Tabelle wie in Access und Ihre kompliziertere Tabelle zu erstellen.
select a.a, b.a,
case
when a.a = 0 or b.a = 0 then 0
when a.a = b.a then 1
end
from
(select 1 A union all select 0 union all select null) a,
(select 1 A union all select 0 union all select null) b
order by a.a, b.a
Dies lässt sich leicht als Funktion ausdrücken
create function dbo.BoolFromBits(@a bit, @b bit) returns bit as
begin
return case
when @a = 0 or @b = 0 then 0
when @a = @b then 1
end
end
SQL Server Konvertierung von anderen Ausdrücken (nicht von einem einzelnen Wert)
Aufgrund der fehlenden Unterstützung für die Umwandlung von Bits in Booleans müssen Ausdrücke, die in SQL Server bereits [true/false/null] sind, in einer CASE-Anweisung wiederholt werden.
Ein Beispiel ist ein "true boolean" in SQL Server, das nicht das Ergebnis einer Spalte sein kann.
select A > B -- A=B resolves to one of true/false/null
from C
Muß ausgedrückt werden als
select case when A is null or B is null then null when A > B then 1 else 0 end
from C
Wenn aber A kein Einzelwert ist, sondern eine Unterabfrage wie (select sum(x)...)
wie Sie sehen, erscheint A zweimal und wird in der CASE-Anweisung zweimal ausgewertet (wiederholt).
ABSCHLUSSPRÜFUNG Jetzt setzen wir alle Konvertierungsregeln in diesem langen Ausdruck um
SELECT X AND Y=Z AND C FROM ..
( assume X is numeric 5, and C is varchar "H" )
( note C contributes either TRUE or NULL in Access )
Dies wird auf SQL Server übertragen (Verkettung der beiden Funktionen und Verwendung von CASE)
SELECT dbo.BoolFromBits(
dbo.BoolFromBits(dbo.BoolFromAny(X), CASE WHEN Y=Z then 1 else 0 end),
dbo.BoolFromAny(C))
FROM ...
Zugang Bool or bool
Der Vollständigkeit halber ist hier die Wahrheitstabelle für Access bool OR bool
. Im Wesentlichen ist es das Gegenteil von AND, also
- Beide müssen false sein, um false zurückzugeben
- Beides ist wahr und gibt wahr zurück (unabhängig von Nullen)
- Andernfalls wird null zurückgegeben.
Die SQL SERVER-Fallanweisung würde also lauten
case
when a.a = 1 or b.a = 1 then 1
when a.a = b.a then 0
end
(das Weglassen einer ELSE-Klausel ist beabsichtigt, da das Ergebnis NULL ist, wenn es weggelassen wird)