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

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

Например:

SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
1078
задан Eric Labashosky 15 сент. '08 в 17:34
источник поделиться
22 ответов

Оператор 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, который также доступен в access: (указано Мартин Смит)

SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
1297
ответ дан Darrel Miller 15 сент. '08 в 17:38
источник поделиться

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

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

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 в предложении order by для действительно причудливого упорядочения.

238
ответ дан Jonathan 15 сент. '08 в 18:10
источник поделиться

В 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 

Иногда необходимо избегать проблем с параметрами, использующими этот подход.

187
ответ дан Martin Smith 21 июля '11 в 2:39
источник поделиться

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

SELECT
    FirstName, LastName,
    Salary, DOB,
    CASE Gender
        WHEN 'M' THEN 'Male'
        WHEN 'F' THEN 'Female'
    END
FROM Employees
64
ответ дан sven 15 сент. '08 в 17:39
источник поделиться

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

SELECT Salable =
        CASE Obsolete
        WHEN 'N' THEN 1
        ELSE 0
    END
63
ответ дан palehorse 15 сент. '08 в 17:37
источник поделиться
SELECT  
(CASE 
     WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
                                            ELSE 'NO' 
 END) as Salable
, * 
FROM Product
37
ответ дан John Sheehan - Runscope 15 сент. '08 в 17:37
источник поделиться

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
32
ответ дан user7658 15 сент. '08 в 17:40
источник поделиться
 SELECT
   CASE 
      WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE' 
      ELSE 'FALSE' 
   END AS Salable,
   * 
FROM PRODUCT
32
ответ дан Santiago Cepas 15 сент. '08 в 17:37
источник поделиться

Из этой ссылка, мы можем uderstand 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?

29
ответ дан Ken 06 янв. '10 в 4:02
источник поделиться

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

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' up?';
ELSE
  PRINT 'Bye Ravi Anand.';
END;

GO
21
ответ дан Ravi Anand 17 дек. '15 в 20:24
источник поделиться

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

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

etc...
16
ответ дан Christopher 15 сент. '08 в 17:40
источник поделиться

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

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 метод.

16
ответ дан Tomasito 09 июня '13 в 1:21
источник поделиться

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

SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
14
ответ дан sandeep rawat 26 апр. '16 в 18:10
источник поделиться
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' )
12
ответ дан onedaywhen 11 мая '16 в 18:56
источник поделиться
SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
From profile
9
ответ дан atik sarker 25 авг. '15 в 12:44
источник поделиться
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
8
ответ дан Chanukya 09 дек. '15 в 15:15
источник поделиться

Если вы впервые вставляете результаты в таблицу, а не передаете результаты из одной таблицы в другую, это работает в 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');
8
ответ дан Robert B. Grossman 26 окт. '12 в 18:30
источник поделиться

Это не ответ, просто пример используемого оператора 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]
8
ответ дан JustJohn 12 февр. '16 в 0:35
источник поделиться
  SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
5
ответ дан SURJEET SINGH Bisht 30 нояб. '16 в 14:05
источник поделиться

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

SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM   Product 
3
ответ дан Dibin 08 янв. '14 в 13:18
источник поделиться
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0 
             END AS Saleable, * 
FROM Product
2
ответ дан user8422856 09 авг. '17 в 0:33
источник поделиться
CASE       
    WHEN CAST([PartnerProg Start Date] AS DATE) < CAST('1-Nov-2010' AS DATE)  
        AND CAST([PartnerProg End Date] AS DATE) > CAST('31-Jan-2011' AS DATE)
    THEN 'Preferred or Gold'
ELSE 
     ''
END 
    AS 'Partner Segment 2 Q111',

используйте это, если вы хотите сравнить более одной даты

-3
ответ дан Shashidhar Jarung 29 февр. '12 в 17:37
источник поделиться

Другие вопросы по меткам