Як мені виконати 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
Затвердження ближче до ПЧ в 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>
Ви навіть можете розміщувати випадок справ у порядку, за допомогою пункту дійсного замовлення.
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
Іноді потрібно бути обережним, щоб уникнути проблем з обнюхуванням параметрів при такому підході .
Ви можете знайти кілька прикладних прикладів у The Power of 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
SELECT
(CASE
WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
ELSE 'NO'
END) as Salable
, *
FROM Product
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' або Якщо InStock значення = 'Y', то вихід буде дорівнює 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
Як тільки ви зрозумієте, як це працює, ви можете перетворити три результати на два результати, вирішивши поведінку нуля. Наприклад, це вважатиметься недійсним як неподатливим:
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, але може не працювати на інших платформах)
Ви можете використовувати заяву:
Select
Case WHEN (Obsolete = 'N' or InStock = 'Y') THEN 1 ELSE 0 END Saleable,
Product.*
from Product