Как выполнить IF ... ТОГДА в SQL SELECT?

Как выполнить команду IF...THEN в SQL SELECT ?

Например:

 SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
 
вопрос задан 15.09.2008
Eric Labashosky
11247 репутация

22 ответов


  • 0 рейтинг

    Вы можете найти несколько хороших примеров в силе SQL CASE Statement , и я думаю, что утверждение, которое вы можете использовать, будет чем-то вроде этого (из 4guysfromrolla ):

     SELECT
        FirstName, LastName,
        Salary, DOB,
        CASE Gender
            WHEN 'M' THEN 'Male'
            WHEN 'F' THEN 'Female'
        END
    FROM Employees
     
    ответ дан sven, с репутацией 11004, 15.09.2008
  • 0 рейтинг

    Microsoft SQL Server (T-SQL)

    При выборе:

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

    В предложении where используйте:

     where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end
     
    ответ дан user7658, с репутацией 744, 15.09.2008
  • 0 рейтинг

    Используйте оператор CASE:

     SELECT CASE
           WHEN (Obsolete = 'N' OR InStock = 'Y')
           THEN 'Y'
           ELSE 'N'
    END as Available
    
    etc...
     
    ответ дан user7658, с репутацией 744, 15.09.2008
  • 0 рейтинг
    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
    
    ответ дан Chanukya, с репутацией 4330, 9.12.2015
  • 0 рейтинг

    Дело в этом случае является вашим другом и принимает одну из двух форм:

    Простой случай:

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

    Продленный случай:

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

    Вы даже можете поставить case-заявления в порядке заказа, чтобы действительно причудливый заказ.

    ответ дан Jonathan, с репутацией 14637, 15.09.2008
  • 0 рейтинг

    Простая инструкция if-else в SQL Server:

     DECLARE @val INT;
    SET @val = 15;
    
    IF @val < 25
    PRINT 'Hi Ravi Anand';
    ELSE
    PRINT 'By Ravi Anand.';
    
    GO
     

    Вложенный If ... else в 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
     
    ответ дан Ravi Anand, с репутацией 1248, 17.12.2015
  • 0 рейтинг

    Новая функция, IIF (которую мы можем просто использовать), была добавлена ​​в SQL Server 2012:

     SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
     
    ответ дан sandeep rawat, с репутацией 3041, 26.04.2016
  • 0 рейтинг

    Если вы впервые вставляете результаты в таблицу, а не переносите результаты из одной таблицы в другую, это работает в 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');
     
    ответ дан Robert B. Grossman, с репутацией 121, 26.10.2012
  • 0 рейтинг
    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' )
    
    ответ дан onedaywhen, с репутацией 42324, 11.05.2016
  • 0 рейтинг

    Из SQL Server 2012 вы можете использовать функцию IIF для этого.

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

    Это фактически просто сокращенный (хотя и не стандартный SQL) способ записи CASE .

    Я предпочитаю краткость по сравнению с расширенной версией CASE .

    Как IIF() и CASE разрешаются как выражения в SQL-заявлении и могут использоваться только в четко определенных местах.

    Выражение CASE не может использоваться для управления потоком выполнения операторов Transact-SQL, блоков операторов, пользовательских функций и хранимых процедур.

    Если ваши потребности не могут быть удовлетворены этими ограничениями (например, необходимость возвращать различные результирующие наборы в зависимости от какого-либо условия), то SQL Server также имеет процедурное IF Ключевое слово.

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

    Тем не менее, иногда следует соблюдать осторожность, чтобы избежать проблем с параметрами нюхания при таком подходе.

    ответ дан Martin Smith, с репутацией 333672, 20.07.2011
  • 0 рейтинг
    SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0 
                 END AS Saleable, * 
    FROM Product
    
    ответ дан SURJEET SINGH Bisht, с репутацией 697, 8.08.2017
  • 0 рейтинг

    Используйте чистую логику бит:

     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
     

    См. Рабочую демонстрацию: ЕСЛИ БЕЗ ДЕЛА В MSSQL

    Для начала вам необходимо выработать значение true и false для выбранных условий. Вот два NULLIF :

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

    вместе взятые дают 1 или 0. Далее используют побитовые операторы .

    Это самый способ WYSIWYG .

    ответ дан Tomasito, с репутацией 1279, 8.06.2013
  • 0 рейтинг

    Из этой ссылки мы можем удержать IF THEN ELSE в 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' 
     

    Разве это недостаточно для T-SQL?

    ответ дан Ken, с репутацией 922, 6.01.2010
  • 0 рейтинг

    В качестве альтернативного решения для подхода, основанного на таблице с таблицей CASE можно использовать.

     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 
     

    Результат:

     ID          Obsolete   InStock    Saleable
    ----------- ---------- ---------- -----------
    1           N          Y          1
    2           A          B          0
    3           N          B          1
    4           A          Y          1
     
    ответ дан Serkan Arslan, с репутацией 7812, 31.01.2018
  • 0 рейтинг
      SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
    
    ответ дан SURJEET SINGH Bisht, с репутацией 697, 30.11.2016
  • 0 рейтинг
    SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
    From profile
    
    ответ дан atik sarker, с репутацией 2198, 25.08.2015
  • 0 рейтинг

    Для тех, кто использует SQL Server 2012, IIF - это функция, которая была добавлена ​​и работает как альтернатива операторам Case.

     SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
    FROM   Product 
     
    ответ дан Dibin, с репутацией 989, 8.01.2014
  • 0 рейтинг
    SELECT  
    (CASE 
         WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
                                                ELSE 'NO' 
     END) as Salable
    , * 
    FROM Product
    
    ответ дан John Sheehan, с репутацией 62875, 15.09.2008
  • 0 рейтинг

    Используйте CASE. Что-то вроде этого.

     SELECT Salable =
            CASE Obsolete
            WHEN 'N' THEN 1
            ELSE 0
        END
     
    ответ дан palehorse, с репутацией 17627, 15.09.2008
  • 0 рейтинг
     SELECT
       CASE 
          WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE' 
          ELSE 'FALSE' 
       END AS Salable,
       * 
    FROM PRODUCT
    
    ответ дан Santiago Cepas, с репутацией 3324, 15.09.2008
  • 0 рейтинг

    Это не ответ, просто пример использования CASE, когда я работаю. Он имеет вложенный оператор CASE. Теперь вы знаете, почему мои глаза пересекаются.

      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]
     
    ответ дан JustJohn, с репутацией 548, 11.02.2016
  • 0 рейтинг

    Оператор CASE является ближайшим к IF в SQL и поддерживается во всех версиях SQL Server

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

    Вам нужно всего лишь сделать CAST если вы хотите получить результат в виде логического значения, если вы довольны int , это работает:

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

    CASE операторов могут быть встроены в другие CASE операторов и даже включены в агрегаты.

    SQL Server Denali (SQL Server 2012) добавляет инструкцию IIF, которая также доступна в доступе : (отметил Мартин Смит )

     SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
     
    ответ дан Darrel Miller, с репутацией 109149, 15.09.2008