1774 Stimmen

Wie führe ich ein IF...THEN in einem SQL SELECT aus?

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

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 y CHECK aber nicht SELECT .

7 Stimmen

Die Antwort von @MartinSmith ist die eleganteste - verwenden Sie IIF in SQL 2012+.

25voto

Verwenden Sie eine CASE-Anweisung:

SELECT CASE
       WHEN (Obsolete = 'N' OR InStock = 'Y')
       THEN 'Y'
       ELSE 'N'
END as Available

etc...

24voto

sandeep rawat Punkte 4540

Eine neue Funktion, IIF (die wir einfach verwenden können), wurde in SQL Server 2012 hinzugefügt:

SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product

2 Stimmen

Diese Antwort wiederholt (mit weniger Details), was bereits bereits in der Antwort von Martin Smith enthalten vor einigen Jahren.

1 Stimmen

@jk7 das war die erste Antwort auf die Frage.

5 Stimmen

Nicht von dem, was ich sehe. Hier steht, dass Ihre Antwort am 26. April '16 und die von Martin am 20. Juli '11 veröffentlicht wurde.

23voto

Tomasito Punkte 1824

Verwenden Sie reine Bitlogik:

DECLARE @Product TABLE (
    id INT PRIMARY KEY IDENTITY NOT NULL
   ,Obsolote CHAR(1)
   ,Instock CHAR(1)
)

INSERT INTO @Product ([Obsolote], [Instock])
    VALUES ('N', 'N'), ('N', 'Y'), ('Y', 'Y'), ('Y', 'N')

;
WITH cte
AS
(
    SELECT
        'CheckIfInstock' = CAST(ISNULL(NULLIF(ISNULL(NULLIF(p.[Instock], 'Y'), 1), 'N'), 0) AS BIT)
       ,'CheckIfObsolote' = CAST(ISNULL(NULLIF(ISNULL(NULLIF(p.[Obsolote], 'N'), 0), 'Y'), 1) AS BIT)
       ,*
    FROM
        @Product AS p
)
SELECT
    'Salable' = c.[CheckIfInstock] & ~c.[CheckIfObsolote]
   ,*
FROM
    [cte] c

Ver Arbeitsdemo: wenn dann ohne case in SQL Server .

Für den Anfang müssen Sie den Wert von true y false für ausgewählte Bedingungen. Hier kommen zwei NULLIF :

for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1)
for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)

ergibt zusammen 1 oder 0. Als nächstes verwenden Sie bitweise Operatoren .

Es ist die wichtigste WYSIWYG Methode.

19 Stimmen

-1 für Code-Verschleierung. Im Ernst, das ist so weit von WYSIWYG entfernt, wie man nur sein kann! Ein verdammt unlesbares Durcheinander, und wenn ich an Ihrem Code arbeiten müsste, würde ich den ganzen Tag fluchen... sorry :-/

2 Stimmen

@Heliac setzen cte Teil in View und Sie werden nie sehen, das Chaos. Bei langen und komplizierten AND, OR, NOT ist es lesbarer als CASE (der Teil außerhalb von cte natürlich).

1 Stimmen

Ich habe dem Ganzen ein +1 für die Übersichtlichkeit gegeben, sobald es in einem CTE steht, aber beachte, dass die Antwort für die Frage derzeit falsch ist. Sie brauchen einen "|" und kein "&".

18voto

onedaywhen Punkte 52850
SELECT 1 AS Saleable, *
  FROM @Product
 WHERE ( Obsolete = 'N' OR InStock = 'Y' )
UNION
SELECT 0 AS Saleable, *
  FROM @Product
 WHERE NOT ( Obsolete = 'N' OR InStock = 'Y' )

16voto

SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
From profile

CodeJaeger.com

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.

Powered by:

X