Wie führe ich eine IF...THEN
in einem SQL SELECT
Aussage?
Zum Beispiel:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
Wie führe ich eine IF...THEN
in einem SQL SELECT
Aussage?
Zum Beispiel:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
Dies ist keine Antwort, sondern nur ein Beispiel für eine CASE-Anweisung, die bei meiner Arbeit verwendet wird. Sie enthält eine verschachtelte CASE-Anweisung. Jetzt wissen Sie, warum ich die Augen schiele.
CASE orweb2.dbo.Inventory.RegulatingAgencyName
WHEN 'Region 1'
THEN orweb2.dbo.CountyStateAgContactInfo.ContactState
WHEN 'Region 2'
THEN orweb2.dbo.CountyStateAgContactInfo.ContactState
WHEN 'Region 3'
THEN orweb2.dbo.CountyStateAgContactInfo.ContactState
WHEN 'DEPT OF AGRICULTURE'
THEN orweb2.dbo.CountyStateAgContactInfo.ContactAg
ELSE (
CASE orweb2.dbo.CountyStateAgContactInfo.IsContract
WHEN 1
THEN orweb2.dbo.CountyStateAgContactInfo.ContactCounty
ELSE orweb2.dbo.CountyStateAgContactInfo.ContactState
END
)
END AS [County Contact Name]
Die Bearbeitung, die die Case-Anweisungen neu formatiert ist alles schön und gut und macht es verständlicher, aber die SQL würde immer noch alle Klumpen in der Ansicht, die es verwendet wird.
Ich frage mich nur, warum CASE
hochgestuft und als Antwort markiert werden, anstatt die IF
die die Antwort hätte sein sollen, wie diese hier, ist dies immer noch eine CASE
Anweisung, nicht eine IF
.
Wenn Sie Ergebnisse zum ersten Mal in eine Tabelle einfügen, anstatt Ergebnisse von einer Tabelle in eine andere zu übertragen, funktioniert dies in Oracle 11.2g:
INSERT INTO customers (last_name, first_name, city)
SELECT 'Doe', 'John', 'Chicago' FROM dual
WHERE NOT EXISTS
(SELECT '1' from customers
where last_name = 'Doe'
and first_name = 'John'
and city = 'Chicago');
Als alternative Lösung zur CASE
Anweisung kann ein tabellengesteuerter Ansatz verwendet werden:
DECLARE @Product TABLE (ID INT, Obsolete VARCHAR(10), InStock VARCHAR(10))
INSERT INTO @Product VALUES
(1,'N','Y'),
(2,'A','B'),
(3,'N','B'),
(4,'A','Y')
SELECT P.* , ISNULL(Stmt.Saleable,0) Saleable
FROM
@Product P
LEFT JOIN
( VALUES
( 'N', 'Y', 1 )
) Stmt (Obsolete, InStock, Saleable)
ON P.InStock = Stmt.InStock OR P.Obsolete = Stmt.Obsolete
Ergebnis:
ID Obsolete InStock Saleable
----------- ---------- ---------- -----------
1 N Y 1
2 A B 0
3 N B 1
4 A Y 1
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.
17 Stimmen
Das sollten Sie sich ansehen Link . Bezüglich: SQL WHERE-Klauseln: Vermeiden Sie CASE, verwenden Sie boolesche Logik
4 Stimmen
@Somebody: Das ist nicht wirklich relevant, denn in dem Artikel geht es darum, logische Umschreibregeln zu verwenden, um eine Implikation in eine Disjunktion umzuwandeln. Der Hinweis ist das Wort "logisch", d. h. etwas, das sich in wahr oder falsch auflöst, was für die Projektion nicht zutrifft. TL;DR Artikel gilt für
WHERE
yCHECK
aber nichtSELECT
.7 Stimmen
Die Antwort von @MartinSmith ist die eleganteste - verwenden Sie IIF in SQL 2012+.