Как мне выполнить IF...THEN
в SQL SELECT
заявлении?
Например:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHERE
и к, CHECK
но не к SELECT
.
Как мне выполнить IF...THEN
в SQL SELECT
заявлении?
Например:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
WHERE
и к, CHECK
но не к SELECT
.
Ответы:
Этот 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
Ситуация в вашем случае - ваш друг, и она принимает одну из двух форм:
Простой случай:
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 в порядок по условию для действительно необычного порядка.
AS Col_Name
после, END
чтобы назвать результирующий столбец
С 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 CASE , и я думаю, что заявление, которое вы можете использовать, будет примерно таким (от 4guysfromrolla ):
SELECT
FirstName, LastName,
Salary, DOB,
CASE Gender
WHEN 'M' THEN 'Male'
WHEN 'F' THEN 'Female'
END
FROM Employees
Используйте CASE. Что-то вроде этого.
SELECT Salable =
CASE Obsolete
WHEN 'N' THEN 1
ELSE 0
END
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
where Obsolete = 'N' or InStock = 'Y'
и практически не разрезать "где"
По этой ссылке мы можем понять 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?
SELECT
CASE
WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE'
ELSE 'FALSE'
END AS Salable,
*
FROM PRODUCT
Простой оператор 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
SELECT
как спросил ОП?
В SQL Server 2012 была добавлена новая функция IIF (которую мы можем просто использовать):
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
Используйте чистую битовую логику:
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
Смотрите рабочую демонстрацию: если тогда без case
в SQL Server .
Для начала нужно отработать значение true
и false
для выбранных условий. Вот два NULLIF :
for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1)
for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)
объединение дает 1 или 0. Далее используйте побитовые операторы .
Это самый метод 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
Это не ответ, а пример использования оператора 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]
CASE
меня проголосовали и отметили как ответ вместо того, IF
который должен был быть ответом, как этот, это все еще CASE
утверждение, а не ответ IF
.
Если вы вставляете результаты в таблицу впервые, а не переносите результаты из одной таблицы в другую, это работает в 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');
В качестве альтернативного решения 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
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0
END AS Saleable, *
FROM Product
Для тех, кто использует SQL Server 2012, IIF - это функция, которая была добавлена и работает в качестве альтернативы операторам Case.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
У вас может быть два варианта для реализации:
Использование IIF, которое появилось в SQL Server 2012:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
Использование Select Case
:
SELECT CASE
WHEN Obsolete = 'N' or InStock = 'Y'
THEN 1
ELSE 0
END as Saleable, *
FROM Product
Использование SQL CASE аналогично обычным операторам If / Else. В следующем запросе, если устаревшее значение = 'N' или If InStock value = 'Y', тогда Output будет 1. В противном случае, вывод будет 0. Затем мы помещаем это 0 или 1 значение в столбец Salable.
SELECT
CASE
WHEN obsolete = 'N' OR InStock = 'Y'
THEN 1
ELSE 0
END AS Salable
, *
FROM PRODUCT
If..Then...Else..
заявления в SQL
следующем ....
SELECT
CAST(
CASE WHEN Obsolete = 'N'
or InStock = 'Y' THEN ELSE 0 END AS bit
) as Saleable, *
FROM
Product
Это будет что-то вроде этого:
SELECT OrderID, Quantity,
CASE
WHEN Quantity > 30 THEN "The quantity is greater than 30"
WHEN Quantity = 30 THEN "The quantity is 30"
ELSE "The quantity is under 30"
END AS QuantityText
FROM OrderDetails;
SELECT OrderID, Quantity, CASE WHEN Quantity > 30 THEN "The quantity is greater than 30" WHEN Quantity = 30 THEN "The quantity is 30" ELSE "The quantity is under 30" END AS QuantityText FROM OrderDetails WHERE QuantityText = 'The quantity is 30';
Для полноты картины я бы добавил, что в SQL используется трехзначная логика. Выражение:
obsolete = 'N' OR instock = 'Y'
Может дать три отличных результата:
| obsolete | instock | saleable |
|----------|---------|----------|
| Y | Y | true |
| Y | N | false |
| Y | null | null |
| N | Y | true |
| N | N | true |
| N | null | true |
| null | Y | true |
| null | N | null |
| null | null | null |
Например, если товар устарел, но вы не знаете, есть ли товар в наличии, вы не знаете, продается ли товар. Вы можете написать эту трехзначную логику следующим образом:
SELECT CASE
WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
WHEN NOT (obsolete = 'N' OR instock = 'Y') THEN 'false'
ELSE NULL
END AS saleable
Как только вы поймете, как это работает, вы можете преобразовать три результата в два, решив поведение null. Например, это будет относиться к null как к нереализуемому:
SELECT CASE
WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
ELSE 'false' -- either false or null
END AS saleable
Мне нравится использование операторов CASE, но вопрос, заданный для оператора IF в SQL Select. То, что я использовал в прошлом, было:
SELECT
if(GENDER = "M","Male","Female") as Gender
FROM ...
Это как операторы Excel или листов IF, где есть условное условие, за которым следует истинное условие, а затем ложное условие:
if(condition, true, false)
Кроме того, вы можете вкладывать операторы if (но для использования следует использовать CASE :-)
(Примечание: это работает в MySQLWorkbench, но может не работать на других платформах)
Вы можете использовать Case Statement:
Select
Case WHEN (Obsolete = 'N' or InStock = 'Y') THEN 1 ELSE 0 END Saleable,
Product.*
from Product