etc./StackOverFlow

SQL SELECT에서 IF...THEN을 어떻게 수행합니까?

청렴결백한 만능 재주꾼 2022. 1. 22. 07:11
반응형

질문자 :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

Darrel Miller

사례 진술은 이 상황에서 당신의 친구이며 두 가지 형식 중 하나를 취합니다.

간단한 경우:

 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 문을 넣을 수도 있습니다.


Jonathan

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

그러나 때때로 이 접근 방식에서 매개변수 스니핑 문제를 피하기 위해 주의를 기울여야 합니다 .


Martin Smith

Power of SQL CASE Statements 에서 몇 가지 좋은 예를 찾을 수 있으며 사용할 수 있는 명령문은 다음과 같을 것이라고 생각합니다( 4guysfromrolla ).

 SELECT FirstName, LastName, Salary, DOB, CASE Gender WHEN 'M' THEN 'Male' WHEN 'F' THEN 'Female' END FROM Employees

sven

CASE를 사용합니다. 이 같은.

 SELECT Salable = CASE Obsolete WHEN 'N' THEN 1 ELSE 0 END

palehorse

SELECT (CASE WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'YES' ELSE 'NO' END) as Salable , * FROM Product

John Sheehan

마이크로소프트 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

user7658

이 링크 에서 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에 충분하지 않습니까?


Ken

 SELECT CASE WHEN OBSOLETE = 'N' or InStock = 'Y' THEN 'TRUE' ELSE 'FALSE' END AS Salable, * FROM PRODUCT

Santiago Cepas

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

Ravi Anand

CASE 문 사용:

 SELECT CASE WHEN (Obsolete = 'N' OR InStock = 'Y') THEN 'Y' ELSE 'N' END as Available etc...

Christopher

새로운 기능인 IIF (간단히 사용할 수 있음)가 SQL Server 2012에 추가되었습니다.

 SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product

sandeep rawat

순수 비트 논리 사용:

 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 .

시작하려면 선택한 조건에 대해 truefalse 값을 계산해야 합니다. 여기에 두 개의 NULLIF가 있습니다 .

 for true: ISNULL(NULLIF(p.[Instock], 'Y'), 1) for false: ISNULL(NULLIF(p.[Instock], 'N'), 0)

함께 결합하면 1 또는 0이 됩니다. 다음으로 비트 연산자를 사용합니다.

가장 WYSIWYG 방식입니다.


Tomasito

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' )

onedaywhen

SELECT CASE WHEN profile.nrefillno = 0 THEN 'N' ELSE 'R'END as newref From profile

Mohammad Atiour Islam

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

Chanukya

이것은 대답이 아니라 내가 일하는 곳에서 사용되는 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]

JustJohn

한 테이블에서 다른 테이블로 결과를 전송하는 대신 처음으로 결과를 테이블에 삽입하는 경우 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');

Robert B. Grossman

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

Serkan Arslan

SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0 END AS Saleable, * FROM Product

user8422856

SQL Server 2012를 사용하는 사람들을 위해 IIF가 추가되어 Case 문에 대한 대안으로 작동하는 기능입니다.

 SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Salable, * FROM Product

Dibin

실제로 구현하기 위해 두 가지 선택을 할 수 있습니다.

  1. SQL Server 2012에서 도입된 IIF 사용:

     SELECT IIF ( (Obsolete = 'N' OR InStock = 'Y'), 1, 0) AS Saleable, * FROM Product
  2. Select Case 사용:

     SELECT CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN 1 ELSE 0 END as Saleable, * FROM Product

user11127093

  SELECT IIF(Obsolete = 'N' OR InStock = 'Y',1,0) AS Saleable, * FROM Product

SURJEET SINGH Bisht

질문:

 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 을 사용하면 문제를 방지하는 데 도움이 됩니다.


David Cohn

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

Tharuka

SELECT if((obsolete = 'N' OR instock = 'Y'), 1, 0) AS saleable, * FROM product;

yusuf hayırsever

그것은 다음과 같을 것입니다:

 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;

Muhammad Awais

SELECT CAST( CASE WHEN Obsolete = 'N' or InStock = 'Y' THEN ELSE 0 END AS bit ) as Saleable, * FROM Product

laplace

완성도를 위해 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

Salman A

CASE 문 사용이 마음에 들지만 SQL Select에서 IF 문을 묻는 질문이 있습니다. 내가 과거에 사용한 것은 다음과 같습니다.

 SELECT if(GENDER = "M","Male","Female") as Gender FROM ...

조건부 다음에 true 조건이 오고 그 다음 false 조건이 있는 Excel 또는 시트 IF 문과 같습니다.

 if(condition, true, false)

또한 if 문을 중첩할 수 있습니다(그러나 사용은 CASE를 사용해야 합니다 :-)

(참고: 이것은 MySQLWorkbench에서 작동하지만 다른 플랫폼에서는 작동하지 않을 수 있습니다)


Prashant Marathay

출처 : http:www.stackoverflow.com/questions/63447/how-do-i-perform-an-if-then-in-an-sql-select

반응형