Как выполнить IF...затем в SQL SELECT?
как мне выполнить IF...THEN
на SQL SELECT
заявление?
например:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
23 ответов
The 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) добавляет ИИФ заявление, которое также доступно в открыть: (указано Мартин Смит)
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 и может использоваться только в четко определенных местах.
дело выражение не может использоваться для управления потоком выполнения Инструкции 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
Microsoft SQL Server (T-SQL)
в выберите Использовать:
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
отсюда ссылке, мы можем uderstand 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 ?
простая инструкция 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
новая функция, IIF (который мы можем просто использовать), был добавлен в SQL Server 2012:
SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
Используйте оператор 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
посмотреть рабочая демо: если тогда без дела в MSSQL
для начала вам нужно разработать значение 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' )
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]
Если вы вставляете результаты в таблицу в первый раз, а не передаете результаты из одной таблицы в другую, это работает в Oracle 11.2 g:
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');
для тех, кто использует SQL Server 2012, IIF - это функция, которая была добавлена и работает как альтернатива операторам Case.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, *
FROM Product
в качестве альтернативного решения 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
выберите CAST(CASE WHEN Obsolete = ' N 'или InStock = 'Y', затем ELSE 0 END AS bit) как товарный, * FROM Product