Question

Comment puis-je effectuer un SI ... THEN dans une instruction SQL SELECT ?

Par exemple:

SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
Était-ce utile?

La solution

L'instruction CASE est la plus proche de IF en SQL et est prise en charge sur toutes les versions de SQL Server.

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

Il vous suffit de faire le CAST si vous voulez que le résultat soit une valeur booléenne. Si vous êtes satisfait d'un int , cela fonctionne:

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

CASE peuvent être incorporées dans d'autres instructions CASE et même incluses dans des agrégats.

SQL Server Denali (SQL Server 2012) ajoute Déclaration IIF disponible également dans accès ( souligné par Martin Smith ):

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

Autres conseils

La déclaration de cas est votre ami dans cette situation et prend l'une des deux formes suivantes:

Le cas simple:

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

Le cas étendu:

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

Vous pouvez même mettre des instructions case dans une commande order by pour une commande vraiment sophistiquée.

A partir de SQL Server 2012, vous pouvez utiliser le . IIF pour cela.

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

Il ne s'agit en réalité que d'une méthode abrégée (bien que non standard SQL) pour écrire CASE .

Je préfère la concision par rapport à la version CASE développée.

IIF () et CASE sont résolus en tant qu'expressions dans une instruction SQL et ne peuvent être utilisés que dans des emplacements bien définis.

  

L'expression CASE ne peut pas être utilisée pour contrôler le flux d'exécution de   Instructions Transact-SQL, blocs d’instruction, fonctions définies par l’utilisateur et   procédures stockées.

Si vos besoins ne peuvent pas être satisfaits par ces limitations (par exemple, la nécessité de renvoyer des ensembles de résultats de formes différentes en fonction de certaines conditions), SQL Server dispose également d'une procédure SI mot clé.

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

Il faut parfois prendre des précautions pour éviter les problèmes de détection de paramètre avec cette approche .

Vous trouverez quelques exemples intéressants dans La puissance de l'instruction SQL CASE , et je pense que la déclaration que vous pouvez utiliser va ressembler à quelque chose comme ça (d'après 4guysfromrolla ):

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

Utilisez CASE. Quelque chose comme ça.

SELECT Salable =
        CASE Obsolete
        WHEN 'N' THEN 1
        ELSE 0
    END
SELECT  
(CASE 
     WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
                                            ELSE 'NO' 
 END) as Salable
, * 
FROM Product
 SELECT
   CASE 
      WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE' 
      ELSE 'FALSE' 
   END AS Salable,
   * 
FROM PRODUCT

Microsoft SQL Server (T-SQL)

Dans un select , utilisez:

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

Dans une clause , utilisez:

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

De de ce lien , nous pouvons comprendre SI ALORS ENSUITE dans 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' 

N'est-ce pas suffisant pour T-SQL?

Instruction simple if-else dans SQL & Server:

DECLARE @val INT;
SET @val = 15;

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

GO

Instruction Nested If ... else dans 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

Utilisez une instruction CASE:

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

etc...

Une nouvelle fonctionnalité, IIF (que nous pouvons simplement utiliser) , a été ajouté dans SQL Server 2012:

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

Utiliser une logique binaire pure:

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

Voir la démonstration de travail: if alors sans case dans SQL & nbsp ; Serveur .

Pour commencer, vous devez déterminer les valeurs de true et false pour les conditions sélectionnées. Voici deux NULLIF :

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

combinés ensemble donne 1 ou 0. Utilisez ensuite les opérateurs au niveau du bit .

Il s'agit de la méthode la plus WYSIWYG .

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' )
SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
From profile
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

Ceci n'est pas une réponse, mais un exemple d'instruction CASE en cours d'utilisation. Il a une déclaration CASE imbriquée. Maintenant, vous savez pourquoi mes yeux sont croisés.

 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]

Si vous insérez des résultats dans une table pour la première fois, plutôt que de transférer les résultats d'une table à une autre, cela fonctionne dans 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');

Comme solution alternative à l'instruction CASE , vous pouvez utiliser une approche basée sur les tables:

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

Résultat:

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

Pour ceux qui utilisent SQL Server 2012, IIF est une fonctionnalité ajoutée qui fonctionne comme une alternative aux instructions Case.

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

Question:

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;

L'utilisation d'alias - p dans ce cas, vous aidera à éviter les problèmes.

Pour cela, vous pouvez avoir deux choix:

  1. Utilisation de IIF, introduite depuis SQL Server 2012:

    SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
    
  2. Utilisation de Sélectionner le cas :

    SELECT CASE
        WHEN Obsolete = 'N' or InStock = 'Y'
            THEN 1
            ELSE 0
        END as Saleable, *
        FROM Product
    
SELECT 
  CAST(
    CASE WHEN Obsolete = 'N' 
    or InStock = 'Y' THEN ELSE 0 END AS bit
  ) as Saleable, * 
FROM 
  Product
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top