복붙노트

[SQL] SQL의 경우 문, 어떻게 여러 변수를 반환?

SQL

SQL의 경우 문, 어떻게 여러 변수를 반환?

나는 같은 내 경우 문에서 여러 값을 반환하고 싶습니다 :

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. ==============================

    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. ==============================

    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. ==============================

    3.정의에 의해 CASE는 단일 값을 반환합니다. 이제까지.

    정의에 의해 CASE는 단일 값을 반환합니다. 이제까지.

    또한 (거의 항상) 첫 번째 조건이 다른 검사를 충족하지 않습니다 수단 경우 단락이 실행됩니다.

  4. ==============================

    4.귀하의 경우에는 두 가지 경우 문, 당신은 반환 할 각 값을 사용합니다.

    귀하의 경우에는 두 가지 경우 문, 당신은 반환 할 각 값을 사용합니다.

  5. ==============================

    5.하여 SQL CASE 절, 제 성공적 정합 조건이 적용되고, 이후 매칭 조건은 무시된다.

    하여 SQL CASE 절, 제 성공적 정합 조건이 적용되고, 이후 매칭 조건은 무시된다.

  6. ==============================

    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. ==============================

    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. ==============================

    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>
    
  9. from https://stackoverflow.com/questions/8358642/case-statement-in-sql-how-to-return-multiple-variables by cc-by-sa and MIT license