it-swarm-eu.dev

Jak provést IF ... THEN v SQL SELECT?

Jak lze provést příkaz IF...THEN v příkazu SQL SELECT?

Například:

SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
1332
Eric Labashosky

Příkaz CASE je nejbližší IF v SQL a je podporován na všech verzích serveru SQL Server

SELECT CAST(
             CASE 
                  WHEN Obsolete = 'N' or InStock = 'Y' 
                     THEN 1 
                  ELSE 0 
             END AS bit) as Saleable, * 
FROM Product

Pokud chcete, aby byl výsledek jako boolean hodnota, pokud jste spokojeni s CAST, stačí provést int

SELECT CASE 
            WHEN Obsolete = 'N' or InStock = 'Y' 
               THEN 1 
               ELSE 0 
       END as Saleable, * 
FROM Product

Příkazy CASE mohou být vloženy do jiných příkazů CASE a dokonce mohou být zahrnuty do agregátů. 

SQL Server Denali (SQL Server 2012) přidává příkaz IIF , který je také k dispozici v access : (upozornil Martin Smith )

SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
1570
Darrel Miller

Prohlášení o případu je v této situaci vaším přítelem a má jednu ze dvou forem:

Jednoduchý případ:

SELECT CASE <variable> WHEN <value>      THEN <returnvalue>
                       WHEN <othervalue> THEN <returnthis>
                                         ELSE <returndefaultcase>
       END AS <newcolumnname>
FROM <table>

Rozšířený případ:

SELECT CASE WHEN <test>      THEN <returnvalue>
            WHEN <othertest> THEN <returnthis>
                             ELSE <returndefaultcase>
       END AS <newcolumnname>
FROM <table>

Můžete dokonce dát případ prohlášení v pořadí podle klauzule pro opravdu luxusní objednávání.

301
Jonathan

Z SQL Server 2012 můžete použít IIF funkce pro tento.

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

To je v podstatě jen zkratka (i když ne standardní SQL) způsob psaní CASE

Dávám přednost stručnosti ve srovnání s rozšířenou verzí CASE.

Jak IIF() a CASE se projeví jako výrazy v rámci SQL příkazu a mohou být použity pouze na dobře definovaných místech. 

Výraz CASE nelze použít k řízení toku provádění příkazů Transact-SQL, bloků příkazů, uživatelem definovaných funkcí a uložených procedur .

Pokud vaše potřeby nemohou být těmito omezeními uspokojeny (například potřeba vrátit různě tvarované sady výsledků závislé na některých podmínkách), pak SQL Server má také procedurální IF Keyword.

IF @IncludeExtendedInformation = 1 
  BEGIN 
      SELECT A,B,C,X,Y,Z 
      FROM   T 
  END 
ELSE 
  BEGIN 
      SELECT A,B,C 
      FROM   T 
  END 

Někdy je třeba věnovat pozornost tomu, aby se u tohoto přístupu zabránilo problémům s čicháním parametrů.

236
Martin Smith

Některé příklady Nice najdete v The Power of SQL CASE Statements, a myslím, že prohlášení, které můžete použít, bude něco takového (z 4guysfromrolla ): 

SELECT
    FirstName, LastName,
    Salary, DOB,
    CASE Gender
        WHEN 'M' THEN 'Male'
        WHEN 'F' THEN 'Female'
    END
FROM Employees
81
sven

Použijte CASE. Něco takového.

SELECT Salable =
        CASE Obsolete
        WHEN 'N' THEN 1
        ELSE 0
    END
73
palehorse
SELECT  
(CASE 
     WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
                                            ELSE 'NO' 
 END) as Salable
, * 
FROM Product
46
John Sheehan
 SELECT
   CASE 
      WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE' 
      ELSE 'FALSE' 
   END AS Salable,
   * 
FROM PRODUCT
43
Santiago Cepas

Z tohoto odkazu , můžeme v IF THEN ELSE uderstand 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' 

Není to dost dobré pro T-SQL?

41
Ken

Microsoft SQL Server (T-SQL)

Při vybraném použití:

select case when Obsolete = 'N' or InStock = 'Y' then 'YES' else 'NO' end

V klauzuli kde použijte:

where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end
40
user7658

Jednoduchý příkaz if-else v serveru SQL:

DECLARE @val INT;
SET @val = 15;

IF @val < 25
PRINT 'Hi Ravi Anand';
ELSE
PRINT 'By Ravi Anand.';

GO

Nested If ... else příkaz v serveru sql -

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
29
Ravi Anand

V SQL Serveru 2012 byla přidána nová funkce IIF (kterou můžeme jednoduše použít):

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

Použijte čistou bitovou logiku:

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

Viz pracovní demo: POKUD NENÍ V PŘÍPADĚ V MSSQL

Pro začátek je třeba zjistit hodnotu true a false pro vybrané podmínky. Zde jsou dva NULLIF :

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

kombinuje dohromady dává 1 nebo 0. Další použití bitové operátory .

Je to nejvíce WYSIWYG metoda.

23
Tomasito

Použijte příkaz CASE:

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

etc...
22
Christopher
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' )
18
onedaywhen
SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
From profile
15
atik sarker
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
13
Chanukya

To není odpověď, jen příklad CASE prohlášení používaného tam, kde pracuji. Má vnořený příkaz CASE. Teď už víš, proč jsou moje oči zkřížené. 

 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]
12
JustJohn

Pokud výsledky vkládáte do tabulky poprvé, místo toho, abyste výsledky přenášeli z jedné tabulky do druhé, funguje to v produktu 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');
11
Robert B. Grossman

Jako alternativní řešení CASE lze použít tabulku řízenou přístupem.

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 

Výsledek:

ID          Obsolete   InStock    Saleable
----------- ---------- ---------- -----------
1           N          Y          1
2           A          B          0
3           N          B          1
4           A          Y          1
9
Serkan Arslan
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0 
             END AS Saleable, * 
FROM Product
8
user8422856
  SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
6

Pro ty, kteří používají SQL Server 2012, IIF je funkce, která byla přidána a funguje jako alternativa k případu prohlášení.

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

SELECT CAST (případ, kdy je zastaralý = 'N' nebo InStock = 'Y' THEN ELSE 0 END AS bit) jako plat, * FROM Product

0
gii96

K tomu můžete mít dvě možnosti:

1) Použití IIF, které bylo zavedeno z SQL 2012:

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

2) Použití Vybrat případ:

SELECT CASE 
    WHEN Obsolete = 'N' or InStock = 'Y' 
        THEN 1 
        ELSE 0 
    END as Saleable, * 
    FROM Product
0
Shivi

Otázka ... SELECT IF (Zastaralé = 'N' OR InStock = 'Y'? 1: 0) AS Plat, * FROM Product

ANSI: Vyberte případ, kdy p.Obsolete = 'N' nebo p.InStock = 'Y' pak 1 jiný 0 konec jako plat, str. * FROM Produkt p;

Použití aliasu - v tomto případě p - pomůže předcházet problémům.

0
David Cohn