Hoe voer ik een IF...THEN
uit in een SQL SELECT
-instructie?
Bijvoorbeeld:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
Antwoord 1, autoriteit 100%
De CASE
-instructie komt het dichtst bij IF in SQL en wordt ondersteund door alle versies van SQL Server.
SELECT CAST(
CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END AS bit) as Saleable, *
FROM Product
U hoeft de CAST
alleen uit te voeren als u het resultaat als een Booleaanse waarde wilt. Als je tevreden bent met een int
, werkt dit:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
CASE
-instructies kunnen worden ingesloten in andere CASE
-instructies en zelfs worden opgenomen in aggregaten.
SQL Server Denali (SQL Server 2012) voegt de IIF-verklaring die ook beschikbaar is in access( opgemerkt door Martin Smith):
SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
Antwoord 2, autoriteit 18%
De case-statement is je vriend in deze situatie en kan twee vormen aannemen:
Het eenvoudige geval:
SELECT CASE <variable> WHEN <value> THEN <returnvalue>
WHEN <othervalue> THEN <returnthis>
ELSE <returndefaultcase>
END AS <newcolumnname>
FROM <table>
De uitgebreide case:
SELECT CASE WHEN <test> THEN <returnvalue>
WHEN <othertest> THEN <returnthis>
ELSE <returndefaultcase>
END AS <newcolumnname>
FROM <table>
Je kunt zelfs case-statements in een volgorde per clausule plaatsen voor echt luxe bestellen.
Antwoord 3, autoriteit 16%
Vanaf SQL Server 2012 kunt u de IIF
-functiehiervoor.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
Dit is eigenlijk gewoon een verkorte (zij het niet standaard SQL) manier om CASE
te schrijven.
Ik geef de voorkeur aan beknoptheid in vergelijking met de uitgebreide CASE
-versie.
Zowel IIF()
als CASE
worden opgelost als expressies binnen een SQL-instructie en kunnen alleen op goed gedefinieerde plaatsen worden gebruikt.
De CASE-expressie kan niet worden gebruikt om de uitvoeringsstroom van
Transact-SQL-instructies, instructieblokken, door de gebruiker gedefinieerde functies en
opgeslagen procedures.
Als uw behoeften niet kunnen worden voldaan door deze beperkingen (bijvoorbeeld een behoefte om een verschillend gevormde resultaat-sets afhankelijk van een bepaalde voorwaarde te retourneren) heeft SQL Server ook een procedurele IF
trefwoord.
IF @IncludeExtendedInformation = 1
BEGIN
SELECT A,B,C,X,Y,Z
FROM T
END
ELSE
BEGIN
SELECT A,B,C
FROM T
END
Zorg moet soms worden genomen om parameter snuivende problemen met deze aanpak te voorkomen. .
Antwoord 4, Autoriteit 5%
U kunt enkele leuke voorbeelden vinden in De kracht van SQL Case-verklaringen , en ik denk dat de verklaring dat je kunt gebruiken, zal zoiets zijn (van 4GUYSFROMROLLA ):
SELECT
FirstName, LastName,
Salary, DOB,
CASE Gender
WHEN 'M' THEN 'Male'
WHEN 'F' THEN 'Female'
END
FROM Employees
Antwoord 5, Autoriteit 4%
Gebruik Case. Zoiets.
SELECT Salable =
CASE Obsolete
WHEN 'N' THEN 1
ELSE 0
END
Antwoord 6, Autoriteit 3%
SELECT
(CASE
WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
ELSE 'NO'
END) as Salable
, *
FROM Product
Antwoord 7, Autoriteit 3%
Microsoft SQL Server (T-SQL)
Gebruik in een select
:
select case when Obsolete = 'N' or InStock = 'Y' then 'YES' else 'NO' end
Gebruik in een where
-clausule:
where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end
Antwoord 8, autoriteit 3%
Van deze link, we kunnen IF THEN ELSE
begrijpen in T-SQL:
IF EXISTS(SELECT *
FROM Northwind.dbo.Customers
WHERE CustomerId = 'ALFKI')
PRINT 'Need to update Customer Record ALFKI'
ELSE
PRINT 'Need to add Customer Record ALFKI'
IF EXISTS(SELECT *
FROM Northwind.dbo.Customers
WHERE CustomerId = 'LARSE')
PRINT 'Need to update Customer Record LARSE'
ELSE
PRINT 'Need to add Customer Record LARSE'
Is dit niet goed genoeg voor T-SQL?
Antwoord 9, autoriteit 2%
SELECT
CASE
WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE'
ELSE 'FALSE'
END AS Salable,
*
FROM PRODUCT
Antwoord 10, autoriteit 2%
Eenvoudige if-else-instructie in SQL-server:
DECLARE @val INT;
SET @val = 15;
IF @val < 25
PRINT 'Hi Ravi Anand';
ELSE
PRINT 'By Ravi Anand.';
GO
Genest If…else-statement in SQL-server –
DECLARE @val INT;
SET @val = 15;
IF @val < 25
PRINT 'Hi Ravi Anand.';
ELSE
BEGIN
IF @val < 50
PRINT 'what''s up?';
ELSE
PRINT 'Bye Ravi Anand.';
END;
GO
Antwoord 11
Gebruik een case-verklaring:
SELECT CASE
WHEN (Obsolete = 'N' OR InStock = 'Y')
THEN 'Y'
ELSE 'N'
END as Available
etc...
Antwoord 12
een nieuwe functie, iif (dat we eenvoudig kunnen gebruiken) , werd toegevoegd in SQL Server 2012:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
Antwoord 13
Gebruik pure bit logic:
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
Zie WERK DEMO: Als dan zonder case
in sql & nbsp ; Server .
Om te beginnen moet je de waarde van true
en false
berekenen voor geselecteerde voorwaarden. Hier komen twee NULLIF:
for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1)
for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)
samen gecombineerd geeft 1 of 0. Gebruik vervolgens bitsgewijze operators.
Het is de meest WYSIWYG-methode.
Antwoord 14
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' )
Antwoord 15
SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
From profile
Antwoord 16
case statement some what similar to if in SQL server
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
Antwoord 17
Dit is geen antwoord, maar een voorbeeld van een CASE-instructie die wordt gebruikt waar ik werk. Het heeft een geneste CASE-instructie. Nu weet je waarom mijn ogen gekruist zijn.
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]
Antwoord 18
Als u de resultaten voor de eerste keer in een tabel invoegt, in plaats van het overbrengen van de resultaten van de ene tabel naar het andere, werkt dit 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');
Antwoord 19
Als een alternatieve oplossing voor de case
verklaring, kan een tabelgedreven aanpak worden gebruikt:
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
Resultaat:
ID Obsolete InStock Saleable
----------- ---------- ---------- -----------
1 N Y 1
2 A B 0
3 N B 1
4 A Y 1
Antwoord 20
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0
END AS Saleable, *
FROM Product
Antwoord 21
Voor degenen die SQL Server 2012 gebruiken, is IIF een functie die is toegevoegd en werkt als een alternatief voor Case-statements.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
Antwoord 22
SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
Antwoord 23
U kunt twee keuzes hebben om dit daadwerkelijk te implementeren:
-
IIF gebruiken, dat werd geïntroduceerd vanaf SQL Server 2012:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
-
Gebruik
Select Case
:SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0 END as Saleable, * FROM Product
Antwoord 24
Vraag:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
ANSI:
Select
case when p.Obsolete = 'N'
or p.InStock = 'Y' then 1 else 0 end as Saleable,
p.*
FROM
Product p;
Het gebruik van aliassen — p
in dit geval — helpt problemen te voorkomen.
Antwoord 25
Het gebruik van SQL CASE is net als normale If / Else-instructies.
In onderstaande query, als verouderde waarde = ‘N’ of als InStock-waarde = ‘Y’, dan is de uitvoer 1. Anders is de uitvoer 0.
Dan plaatsen we die 0 of 1 waarde onder de Verkoopbare Kolom.
SELECT
CASE
WHEN obsolete = 'N' OR InStock = 'Y'
THEN 1
ELSE 0
END AS Salable
, *
FROM PRODUCT
Antwoord 26
SELECT
if((obsolete = 'N' OR instock = 'Y'), 1, 0) AS saleable, *
FROM
product;
Antwoord 27
Het zal ongeveer zo zijn:
SELECT OrderID, Quantity,
CASE
WHEN Quantity > 30 THEN "The quantity is greater than 30"
WHEN Quantity = 30 THEN "The quantity is 30"
ELSE "The quantity is under 30"
END AS QuantityText
FROM OrderDetails;
Antwoord 28
SELECT
CAST(
CASE WHEN Obsolete = 'N'
or InStock = 'Y' THEN ELSE 0 END AS bit
) as Saleable, *
FROM
Product
Antwoord 29
Voor de volledigheid zou ik willen toevoegen dat SQL driewaardige logica gebruikt. De uitdrukking:
obsolete = 'N' OR instock = 'Y'
Kan drie verschillende resultaten opleveren:
| obsolete | instock | saleable |
|---------- | --------- | ----------|
| Y | Y | true |
| Y | N | false |
| Y | null | null |
| N | Y | true |
| N | N | true |
| N | null | true |
| null | Y | true |
| null | N | null |
| null | null | null |
Dus als een product bijvoorbeeld verouderd is, maar u weet niet of het product op voorraad is, weet u niet of het product verkoopbaar is. U kunt deze driewaardige logica als volgt schrijven:
SELECT CASE
WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
WHEN NOT (obsolete = 'N' OR instock = 'Y') THEN 'false'
ELSE NULL
END AS saleable
Zodra u weet hoe het werkt, kunt u drie resultaten converteren naar twee resultaten door het gedrag van null te bepalen. bijv. dit zou null als niet verkoopbaar beschouwen:
SELECT CASE
WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
ELSE 'false' -- either false or null
END AS saleable
Antwoord 30
Ik vind het gebruik van de CASE-statements leuk, maar de vraag vroeg om een IF-statement in de SQL Select. Wat ik in het verleden heb gebruikt is:
SELECT
if(GENDER = "M","Male","Female") as Gender
FROM ...
Het is net als in de Excel- of bladen-IF-statements waar er een voorwaarde is, gevolgd door de ware voorwaarde en dan de valse voorwaarde:
if(condition, true, false)
Bovendien kun je de if-statements nesten (maar gebruik dan een CASE 🙂
(Opmerking: dit werkt in MySQLWorkbench, maar werkt mogelijk niet op andere platforms)