[SQL] SQL의 경우 문, 어떻게 여러 변수를 반환?
SQLSQL의 경우 문, 어떻게 여러 변수를 반환?
나는 같은 내 경우 문에서 여러 값을 반환하고 싶습니다 :
SELECT
CASE
WHEN <condition 1> THEN <value1=a1, value2=b1>
WHEN <condition 2> THEN <value1=a2, value2=b2>
ELSE <value1=a3, value3=b3>
END
FROM <table>
물론 나는 때마다 반환 한 값을 경우 조건을 여러 번 쓸 수 있습니다. 내가 맞게 많은 조건 필요가있다 그러나, 또 다시 경우의 조건을 반복 좋지 않다 (100)을 말한다.
하나 개의 레코드가 여러 조건에 맞는 경우 내가 묻고 싶다 또 다른 질문, 무슨 일이 생긴? 즉, 그들 모두의하거나 마지막 돌아갑니다 의미합니까? 예를 들면 조건 1은 무슨 일이 일어날 조건 (2)의 일부가 될 수있다?
해결법
-
==============================
1.기본적인 방법은, 불행하게도 자신을 반복하는 것입니다.
기본적인 방법은, 불행하게도 자신을 반복하는 것입니다.
SELECT CASE WHEN <condition 1> THEN <a1> WHEN <condition 2> THEN <a2> ELSE <a3> END, CASE WHEN <condition 1> THEN <b1> WHEN <condition 2> THEN <b2> ELSE <b3> END FROM <table>
다행히 대부분의 RDBMS는 조건을 여러 번 평가를 할 필요가 없게하는 영리한 충분하다. 그냥 중복 입력합니다.
MS SQL 서버 (2005 +)에서 당신은 가능한 사용 CROSS이 대안으로 적용 할 수 있습니다. 나는 아무 생각이 없지만 어떻게이 확대됨에 ...
SELECT * FROM <table> CROSS APPLY ( SELECT a1, b1 WHERE <condition 1> UNION ALL SELECT a2, b2 WHERE <condition 2> UNION ALL SELECT a3, b3 WHERE <condition 3> ) AS case_proxy
여기서 눈에 띄는 단점은 더 ELSE 해당 없다는 것입니다 모두 같은 조건을 모두 반환 값, 그들은 하나가 지금까지 한 번에 사실 수 있도록 프레임 할 필요가있다.
편집하다
윽의 대답은 UNION으로 변경보다는 접근 방식을 가입하는 경우,이 매우 유사하게된다. 주요 차이점은, 그러나, 존재에만 다소 조건 당 한번보다 한번 설정된 입력 데이터 (귀하의 경우 100 번) 스캔있다.
편집하다
나는 또한 당신이 CASE 문에 의해 반환되는 값이 고정되어 있음을 의미 할 수 있습니다 것으로 나타났습니다. 동일한 조건을 일치하는 모든 레코드 값 1과 값 2에 정확한 SAMES 값을 얻는다. 이것은 다음과 같이 형성 될 수있다 ...
WITH checked_data AS ( SELECT CASE WHEN <condition1> THEN 1 WHEN <condition2> THEN 2 WHEN <condition3> THEN 3 ... ELSE 100 END AS condition_id, * FROM <table> ) , results (condition_id, value1, value2) AS ( SELECT 1, a1, b1 UNION ALL SELECT 2, a2, b2 UNION ALL SELECT 3, a3, b3 UNION ALL ... SELECT 100, a100, b100 ) SELECT * FROM checked_data INNER JOIN results ON results.condition_id = checked_data.condition_id
-
==============================
2.case 문은 하나의 값을 반환 할 수 있습니다.
case 문은 하나의 값을 반환 할 수 있습니다.
당신은 하위 쿼리에이를 켠 다음 작업중인 어떤 다른 관계로 가입 할 수 있습니다. 예를 들어 (SQL 서버 2K5 + 열팽창 계수를 사용하여) :
WITH C1 AS ( SELECT a1 AS value1, b1 AS value2 FROM table WHERE condition1 ), C2 AS ( SELECT a2 AS value1, b2 AS value2 FROM table WHERE condition2 ), C3 AS ( SELECT a3 AS value1, b3 AS value2 FROM table WHERE condition3 ) SELECT value1, value2 FROM -- some table, joining C1, C2, C3 CTEs to get the cased values ;
-
==============================
3.정의에 의해 CASE는 단일 값을 반환합니다. 이제까지.
정의에 의해 CASE는 단일 값을 반환합니다. 이제까지.
또한 (거의 항상) 첫 번째 조건이 다른 검사를 충족하지 않습니다 수단 경우 단락이 실행됩니다.
-
==============================
4.귀하의 경우에는 두 가지 경우 문, 당신은 반환 할 각 값을 사용합니다.
귀하의 경우에는 두 가지 경우 문, 당신은 반환 할 각 값을 사용합니다.
-
==============================
5.하여 SQL CASE 절, 제 성공적 정합 조건이 적용되고, 이후 매칭 조건은 무시된다.
하여 SQL CASE 절, 제 성공적 정합 조건이 적용되고, 이후 매칭 조건은 무시된다.
-
==============================
6.당신은 UNION와 결합 된 부속을 사용할 수 있습니다. 때마다 하나 개 이상의 조건 사용 또는이 예에서와 같이 괄호와 같은 필드를 반환 할 수 있습니다 :
당신은 UNION와 결합 된 부속을 사용할 수 있습니다. 때마다 하나 개 이상의 조건 사용 또는이 예에서와 같이 괄호와 같은 필드를 반환 할 수 있습니다 :
SELECT * FROM (SELECT val1, val2 FROM table1 WHERE (condition1 is true) OR (condition2 is true)) UNION SELECT * FROM (SELECT val5, val6 FROM table7 WHERE (condition9 is true) OR (condition4 is true))
-
==============================
7.당신이 그들을 추출 후, "경우"표현의 XML 데이터 형식 내에서 여러 값을 반환 할 수 있습니다, 또한 "다른"블록을 사용할 수 있습니다
당신이 그들을 추출 후, "경우"표현의 XML 데이터 형식 내에서 여러 값을 반환 할 수 있습니다, 또한 "다른"블록을 사용할 수 있습니다
SELECT xmlcol.value('(value1)[1]', 'NVARCHAR(MAX)') AS value1, xmlcol.value('(value2)[1]', 'NVARCHAR(MAX)') AS value2 FROM (SELECT CASE WHEN <condition 1> THEN CAST((SELECT a1 AS value1, b1 AS value2 FOR XML PATH('')) AS XML) WHEN <condition 2> THEN CAST((SELECT a2 AS value1, b2 AS value2 FOR XML PATH('')) AS XML) ELSE CAST((SELECT a3 AS value1, b3 AS value2 FOR XML PATH('')) AS XML) END AS xmlcol FROM <table>) AS tmp
-
==============================
8.또는 당신은 할 수
또는 당신은 할 수
SELECT String_to_array(CASE WHEN <condition 1> THEN a1||','||b1 WHEN <condition 2> THEN a2||','||b2 ELSE a3||','||b3 END, ',') K FROM <table>
from https://stackoverflow.com/questions/8358642/case-statement-in-sql-how-to-return-multiple-variables by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL Server 관리 Studio는 - 어떻게 테이블을 삭제하지 않고 필드 유형을 변경합니다 (0) | 2020.07.03 |
---|---|
[SQL] 엔티티 프레임 워크 - 테이블이 존재하는지 확인하는 방법? (0) | 2020.07.03 |
[SQL] 변수 파일 이름으로 대량 삽입 (0) | 2020.07.03 |
[SQL] SQL 서버 AS 문 WHERE 문 내에서 열을 별칭 (0) | 2020.07.03 |
[SQL] 콜렉션의 크기가 0 또는 비어있는 경우 쿼리 HQL 확인하기 (0) | 2020.07.03 |