명세서 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에서 IF에 가장 가깝고 모든 버전의 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 문을 추가하여 액세스 할 수 있습니다 ( Martin Smith가 지적함 ).
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 by 절에 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
The Power of SQL CASE Statements 에서 멋진 예제를 찾을 수 있으며 사용할 수 있는 명령문은 다음과 같습니다 ( 4guysfromrolla ).
SELECT
FirstName, LastName,
Salary, DOB,
CASE Gender
WHEN 'M' THEN 'Male'
WHEN 'F' THEN 'Female'
END
FROM Employees
에서 이 링크 , 우리가 이해할 수있는 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에 충분하지 않습니까?
SQL Server의 간단한 if-else 문 :
DECLARE @val INT;
SET @val = 15;
IF @val < 25
PRINT 'Hi Ravi Anand';
ELSE
PRINT 'By Ravi Anand.';
GO
SQL Server에서 중첩 된 If ... else 문-
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
OP가 요청 한대로 내부 에서 사용할 수 있습니까?
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 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
대신의 답변으로 upvoted 및 표시되고 IF
이 같은 대답을 했어야하는이 여전히입니다 CASE
if 문, 없습니다 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
SQL CASE를 사용하는 것은 일반적인 If / Else 문과 같습니다. 아래 쿼리에서 사용되지 않는 값 = 'N'또는 InStock 값 = 'Y'인 경우 출력은 1이됩니다. 그렇지 않으면 출력이 0이됩니다. 그런 다음 해당 0 또는 1 값을 판매 가능 열 아래에 놓습니다.
SELECT
CASE
WHEN obsolete = 'N' OR InStock = 'Y'
THEN 1
ELSE 0
END AS Salable
, *
FROM PRODUCT
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이 3 값 논리를 사용한다고 덧붙입니다. 표현식:
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 |
예를 들어 제품이 더 이상 사용되지 않지만 제품이 재고품인지 모르는 경우 제품을 판매 할 수 있는지 알 수 없습니다. 이 3 가지 논리를 다음과 같이 작성할 수 있습니다.
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 동작을 결정하여 3 개의 결과를 2 개의 결과로 변환 할 수 있습니다. 예를 들어 이것은 null을 판매 불가능한 것으로 간주합니다.
SELECT CASE
WHEN obsolete = 'N' OR instock = 'Y' THEN 'true'
ELSE 'false' -- either false or null
END AS saleable
CASE 문을 사용하는 것이 좋지만 SQL Select에서 IF 문을 요청했습니다. 내가 과거에 사용한 것은 다음과 같습니다.
SELECT
if(GENDER = "M","Male","Female") as Gender
FROM ...
조건부 다음에 참 조건과 거짓 조건이있는 Excel 또는 sheet IF 문과 같습니다.
if(condition, true, false)
또한 if 문을 중첩 할 수 있습니다 (그러나 CASE :-를 사용해야합니다)
(참고 : 이것은 MySQLWorkbench에서는 작동하지만 다른 플랫폼에서는 작동하지 않을 수 있습니다)