Как выполнить IF... ТОГДА в SQL SELECT?
Как мне выполнить IF...THEN
в операторе SQL SELECT
?
Например:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
Ответы
Ответ 1
Оператор 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
Ответ 2
Дело в этом случае является вашим другом и принимает одну из двух форм:
Простой случай:
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 для действительно причудливого упорядочения.
Ответ 3
С 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
Однако при таком подходе следует иногда проявлять осторожность, чтобы избежать проблем с анализом параметров.
Ответ 4
В Power of SQL CASE вы найдете несколько хороших примеров, и я думаю, что утверждение, которое вы можете использовать, будет чем-то вроде этого (от 4guysfromrolla):
SELECT
FirstName, LastName,
Salary, DOB,
CASE Gender
WHEN 'M' THEN 'Male'
WHEN 'F' THEN 'Female'
END
FROM Employees
Ответ 5
Используйте CASE. Что-то вроде этого.
SELECT Salable =
CASE Obsolete
WHEN 'N' THEN 1
ELSE 0
END
Ответ 6
SELECT
(CASE
WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES'
ELSE 'NO'
END) as Salable
, *
FROM Product
Ответ 7
SELECT
CASE
WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE'
ELSE 'FALSE'
END AS Salable,
*
FROM PRODUCT
Ответ 8
По этой ссылке мы можем понять, 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?
Ответ 9
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
Ответ 10
Простой оператор 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' up?';
ELSE
PRINT 'Bye Ravi Anand.';
END;
GO
Ответ 11
Используйте оператор CASE:
SELECT CASE
WHEN (Obsolete = 'N' OR InStock = 'Y')
THEN 'Y'
ELSE 'N'
END as Available
etc...
Ответ 12
Используйте чистую битовую логику:
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.
Ответ 13
В SQL Server 2012 была добавлена новая функция IIF (которую мы можем просто использовать):
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
Ответ 14
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' )
Ответ 15
SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref
From profile
Ответ 16
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
Ответ 17
Это не ответ, просто пример используемого оператора 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]
Ответ 18
Если вы впервые вставляете результаты в таблицу, а не передаете результаты из одной таблицы в другую, это работает в 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');
Ответ 19
В качестве альтернативного решения оператора 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
Ответ 20
SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0
END AS Saleable, *
FROM Product
Ответ 21
SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
Ответ 22
Для тех, кто использует SQL Server 2012, IIF - это функция, которая была добавлена и работает как альтернатива операторам Case.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
Ответ 23
У вас может быть два варианта для реализации:
-
Использование 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
Ответ 24
Вопрос:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
ANSI:
Select
case when p.Obsolete = 'N'
or p.InStock = 'Y' then 1 else 0 end as Saleable,
p.*
FROM
Product p;
Использование псевдонимов - в данном случае p
- поможет предотвратить проблемы.
Ответ 25
SELECT
CAST(
CASE WHEN Obsolete = 'N'
or InStock = 'Y' THEN ELSE 0 END AS bit
) as Saleable, *
FROM
Product
Ответ 26
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',
используйте это, если вы хотите сравнить более одной даты