Как мне выполнить IF ... THEN в SQL SELECT? - PullRequest
1373 голосов
/ 15 сентября 2008

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

Например:

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

Ответы [ 25 ]

1611 голосов
/ 15 сентября 2008

Оператор 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 (указано Martin Smith ):

SELECT IIF(Obsolete = 'N' or InStock = 'Y', 1, 0) as Saleable, * FROM Product
307 голосов
/ 15 сентября 2008

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

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

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 в порядок по условию для действительно необычного порядка.

245 голосов
/ 21 июля 2011

В 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. 1026 *

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

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

83 голосов
/ 15 сентября 2008

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

SELECT
    FirstName, LastName,
    Salary, DOB,
    CASE Gender
        WHEN 'M' THEN 'Male'
        WHEN 'F' THEN 'Female'
    END
FROM Employees
74 голосов
/ 15 сентября 2008

Используйте CASE. Как то так.

SELECT Salable =
        CASE Obsolete
        WHEN 'N' THEN 1
        ELSE 0
    END
47 голосов
/ 15 сентября 2008
SELECT  
(CASE 
     WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
                                            ELSE 'NO' 
 END) as Salable
, * 
FROM Product
44 голосов
/ 15 сентября 2008
 SELECT
   CASE 
      WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE' 
      ELSE 'FALSE' 
   END AS Salable,
   * 
FROM PRODUCT
43 голосов
/ 06 января 2010

С по этой ссылке , мы можем понять 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?

42 голосов
/ 15 сентября 2008

Microsoft SQL Server (T-SQL)

В select используйте:

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
30 голосов
/ 17 декабря 2015

Простой оператор 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...