복붙노트

[SQL] where 절에서 사용하는 '경우의 표현 열'

SQL

where 절에서 사용하는 '경우의 표현 열'

SELECT ename
  ,    job
  ,    CASE deptno
         WHEN 10
           THEN 'ACCOUNTS'
         WHEN 20
           THEN 'SALES'
         ELSE 'UNKNOWN'
       END AS department
FROM emp /* !!! */ 
WHERE department = 'SALES'

이것은 실패

오라클 10.2 SQL에서 이러한 한계를 극복 할 수있는 방법이 있습니까? 어떻게 where 절에있는 '경우의 표현 열'을 사용 하는가?

해결법

  1. ==============================

    1.이 오류의 원인은 SQL SELECT 문을 논리적으로 * 다음과 같은 순서로 처리되는 것입니다 :

    이 오류의 원인은 SQL SELECT 문을 논리적으로 * 다음과 같은 순서로 처리되는 것입니다 :

    따라서 WHERE 절, 아직 채워 또는 계산되지 않은 것을에서 사용할 수 없습니다. 이 질문을 참조 : 오라클-SQL 절 평가 순서

    데이터베이스 엔진뿐만 아니라 쿼리에 대한 평가의 또 다른 순서로 선택할 수 있습니다 참고있는 유일한 제한은 위의 순서가 사용 된 것처럼 결과가 동일해야한다는 것입니다 (그리고 그들은 보통 무엇을 그의를!) : * 논리적으로 처리됩니다.

    해결 방법은 또 다른 하나의 쿼리를 동봉하는 것입니다 :

    SELECT *
    FROM
      ( SELECT ename
             , job
             , CASE deptno
                 WHEN 10 THEN 'ACCOUNTS'
                 WHEN 20 THEN 'SALES'
                         ELSE 'UNKNOWN'
               END AS department
        FROM emp
      ) tmp
    WHERE department = 'SALES' ;
    

    또는 WHERE 조건에서 계산을 복제합니다 :

    SELECT ename
         , job
         , CASE deptno
             WHEN 10 THEN 'ACCOUNTS'
             WHEN 20 THEN 'SALES'
                     ELSE 'UNKNOWN'
           END AS department
    FROM emp
    WHERE
        CASE deptno
          WHEN 10 THEN 'ACCOUNTS'
          WHEN 20 THEN 'SALES'
                  ELSE 'UNKNOWN'
        END = 'SALES' ;
    

    나는이 조회 또는 사용할 수의 단순화 된 버전 것 같다 :

    SELECT ename
         , job
         , 'SALES' AS department
    FROM emp
    WHERE deptno = 20 ;
    
  2. ==============================

    2.테이블 컬럼 "부서"를 포함하지 않으며, 따라서 당신은 당신의 where 절을 참조 할 수 없습니다. 사용 대신 DEPTNO.

    테이블 컬럼 "부서"를 포함하지 않으며, 따라서 당신은 당신의 where 절을 참조 할 수 없습니다. 사용 대신 DEPTNO.

    SELECT ename
    ,      job
    ,      CASE deptno
              WHEN 10
              THEN 'ACCOUNTS'
              WHEN 20
              THEN 'SALES'
              ELSE 'UNKNOWN'
           END AS department
    FROM   emp /* !!! */ where deptno = 20;
    
  3. ==============================

    3.나를 위해이 작품 :

    나를 위해이 작품 :

    SELECT ename, job
    FROM   emp 
    WHERE CASE WHEN deptno = 10 THEN 'ACCOUNTS'
               WHEN deptno = 20 THEN 'SALES'
               ELSE 'UNKNOWN'  
          END
          = 'SALES'
    
  4. ==============================

    4.

    select emp_.*
    from (SELECT ename
      ,    job
      ,    CASE deptno
             WHEN 10
               THEN 'ACCOUNTS'
             WHEN 20
               THEN 'SALES'
             ELSE 'UNKNOWN'
           END AS department
    FROM emp /* !!! */ ) emp_ where emp_.department='UNKNOWN';
    
  5. ==============================

    5.시험:

    시험:

      SQL> SELECT ename
          2  ,      job
          3  ,      CASE
          4            WHEN  deptno = 10
          5            THEN 'ACCOUNTS'
          6            WHEN  deptno = 20
          7            THEN 'SALES'
         12            ELSE 'UNKNOWN'
         13         END AS department
         14  FROM   emp /* !!! */ where department = 'SALES';
    
  6. ==============================

    6.오라클은 전에 먼저 쿼리가 실패하는 이유입니다 선택 where 절에 대한 이동하여 레코드의 수는 테이블에서 검사 할 필터링을 시도합니다. 또한, 쿼리에 부서 행이 반환되지 않을 것이다 - 때문에 필터의 "계정 또는 알 수 없음"부서 = "판매"

    오라클은 전에 먼저 쿼리가 실패하는 이유입니다 선택 where 절에 대한 이동하여 레코드의 수는 테이블에서 검사 할 필터링을 시도합니다. 또한, 쿼리에 부서 행이 반환되지 않을 것이다 - 때문에 필터의 "계정 또는 알 수 없음"부서 = "판매"

    엔진에 의해 인출하기 쉬운 것, 대신 아래에보십시오 :

    SELECT ENAME, 직업, 'SALES'AS 부서 보낸 사람 EMP WHERE DEPTNO = 20;

  7. from https://stackoverflow.com/questions/6545664/using-case-expression-column-in-where-clause by cc-by-sa and MIT license