Как выполнить IF...THEN
в операторе SQL SELECT
?
Например:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
Оператор 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
Утверждение case - ваш друг в этой ситуации, и оно принимает одну из двух форм:
Простой случай:
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 для действительно причудливого упорядочивания.
Начиная с 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
Вы можете найти некоторые хорошие примеры в Власть случае операторы SQL, и я думаю, что утверждение, которое можно использовать будет что-то вроде этого (из 4guysfromrolla):
SELECT
FirstName, LastName,
Salary, DOB,
CASE Gender
WHEN 'M' THEN 'Male'
WHEN 'F' THEN 'Female'
END
FROM Employees
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
Сервера Майкрософт SQL (Т-SQL)в
В выберите
, Использовать с:
select case when Obsolete = 'N' or InStock = 'Y' then 'YES' else 'NO' end
В, где
положение, используйте:
where 1 = case when Obsolete = 'N' or InStock = 'Y' then 1 else 0 end
Из этой ссылке, мы можем понять, если тогда еще в Т-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, так?
Просто если-else оператор в SQL&ампер;усилитель; nbsp;сервер:
DECLARE @val INT;
SET @val = 15;
IF @val < 25
PRINT 'Hi Ravi Anand';
ELSE
PRINT 'By Ravi Anand.';
GO
Вложенных if...else оператор в SQL&ампер;усилитель; nbsp;сервер -
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
Использовать оператор Case:
SELECT CASE
WHEN (Obsolete = 'N' OR InStock = 'Y')
THEN 'Y'
ELSE 'N'
END as Available
etc...
Использовать чисто немного логики:
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
См. Рабочая демо: если без "дела" в SQL&ампер;усилитель; nbsp;сервер.
Для начала вам нужно отработать значение true
и false
для выбранных условий. Здесь два функция nullif:
for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1)
for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)
в сочетании вместе дает 1 или 0. Далее используйте побитовые операторы.
Это's самая визуальный способ.
Новая функция, если (что мы можем просто использовать), был добавлен в SQL Server 2012 с:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
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. Теперь вы знаете, почему мои глаза пересеклись.
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]
Если вы'вновь вводя результаты в таблицу в первый раз, вместо того чтобы переносить результаты с одного стола на другой, это работает в Oracle 11.2 г:
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');
В качестве альтернативного решения к делу
заявление, таблицы-ориентированный подход может быть использован:
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
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0
END AS Saleable, *
FROM Product