SQL SELECT
문에서 IF...THEN
을 어떻게 수행합니까?
예를 들어:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
질문자 :Eric Labashosky
SQL SELECT
문에서 IF...THEN
을 어떻게 수행합니까?
예를 들어:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
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 문을 넣을 수도 있습니다.
SQL Server 2012에서는 이를 위해IIF
함수 를 사용할 수 있습니다.
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, * FROM Product
CASE
를 작성하는 (표준 SQL은 아니지만) 약식 방법입니다.
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
Power of SQL CASE Statements 에서 몇 가지 좋은 예를 찾을 수 있으며 사용할 수 있는 명령문은 다음과 같을 것이라고 생각합니다( 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
마이크로소프트 SQL 서버(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
이 링크 에서 T-SQL의 IF THEN ELSE
를 이해할 수 있습니다.
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
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
CASE 문 사용:
SELECT CASE WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'Y' ELSE 'N' END as Available etc...
새로운 기능인 IIF (간단히 사용할 수 있음)가 SQL Server 2012에 추가되었습니다.
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
작업 데모를 참조 하세요. if then without case
in 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]
한 테이블에서 다른 테이블로 결과를 전송하는 대신 처음으로 결과를 테이블에 삽입하는 경우 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 NY 1 2 AB 0 3 NB 1 4 AY 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
실제로 구현하기 위해 두 가지 선택을 할 수 있습니다.
SQL Server 2012에서 도입된 IIF 사용:
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
SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product
질문:
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
을 사용하면 문제를 방지하는 데 도움이 됩니다.
SQL CASE를 사용하는 것은 일반적인 If / Else 문과 같습니다. 아래 쿼리에서 If obsolete value = 'N' 또는 If InStock value = 'Y' 그러면 출력은 1이 됩니다. 그렇지 않으면 출력은 0이 됩니다. 그런 다음 해당 0 또는 1 값을 판매 가능한 열 아래에 넣습니다.
SELECT CASE WHEN obsolete = 'N' OR InStock = 'Y' THEN 1 ELSE 0 END AS Salable , * FROM PRODUCT
SELECT if((obsolete = 'N' OR instock = 'Y'), 1, 0) 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 CAST( CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN ELSE 0 END AS bit ) as Saleable, * FROM Product
완성도를 위해 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 ...
조건부 다음에 true 조건이 오고 그 다음 false 조건이 있는 Excel 또는 시트 IF 문과 같습니다.
if(condition, true, false)
또한 if 문을 중첩할 수 있습니다(그러나 사용은 CASE를 사용해야 합니다 :-)
(참고: 이것은 MySQLWorkbench에서 작동하지만 다른 플랫폼에서는 작동하지 않을 수 있습니다)
출처 : http:www.stackoverflow.com/questions/63447/how-do-i-perform-an-if-then-in-an-sql-select
macOS 또는 OS X에 pip를 어떻게 설치합니까? (0) | 2022.01.22 |
---|---|
Node.js 애플리케이션을 어떻게 디버깅합니까? (0) | 2022.01.22 |
java.lang.UnsupportedClassVersionError 수정 방법: 지원되지 않는 major.minor 버전 (0) | 2022.01.22 |
왜 항상 `--set-upstream`을 수행해야 합니까? (0) | 2022.01.22 |
C#에서 모든 열거형 값을 반복하는 방법은 무엇입니까? [복제하다] (0) | 2022.01.22 |