programing

where 절에서 'case expression column' 사용

elseif 2023. 4. 4. 21:06

where 절에서 'case expression column' 사용

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

실패:

ORA-00904: "%s: 잘못된 식별자"

Oracle 10.2 SQL에서 이 제한을 극복하는 방법이 있습니까?where 절의 'case expression column'을 사용하는 방법

이 오류의 원인은 SQL이SELECT스테이트먼트는 논리적으로* 다음 순서로 처리됩니다.

  • : 1개 또는 여러 개의 JOINE 테이블과 일치하는 모든 행 조합을 선택합니다FROM.ON조건들.

  • : 조건이 평가되어 일치하지 않는 행이 삭제됩니다WHERE.

  • GROUP BY: 행이 그룹화됩니다(각 그룹은 1개의 행으로 축소됩니다).

  • : 조건이 평가되어 일치하지 않는 행이 삭제됩니다HAVING.

  • : 컬럼 리스트가 평가됩니다SELECT.

  • : 중복된 행이 삭제됩니다DISTINCT(SELECT DISTING 스테이트먼트인 경우).

  • , , : 해당 오퍼랜드의 액션은 sub-SELECT 문의 행에 대해 수행됩니다UNION.예를 들어 UNION인 경우 모든 서브 SELECT 문이 평가된 후 모든 행이 수집됩니다(UNION ALL이 아닌 한 중복이 제거됩니다).따라서 EXCEPT 또는 CRESS의 경우.

  • : 행이 정렬되어 있습니다ORDER BY.

따라서, 에서는 사용할 수 없습니다.WHERE조항, 아직 채워지거나 계산되지 않은 조항입니다.oracle-sql-clause-evaluation-order도 참조하십시오.

* 논리적으로 처리: 데이터베이스 엔진은 쿼리에 대해 다른 평가 순서를 선택할 수도 있습니다(일반적으로 그렇게 합니다).유일한 제약사항은 위의 순서를 사용한 경우와 결과가 같아야 한다는 것입니다.


해결책은 쿼리를 다른 쿼리로 묶는 것입니다.

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 ;

테이블에 "부서" 열이 없으므로 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;

이 작업은 다음과 같습니다.

SELECT ename, job
FROM   emp 
WHERE CASE WHEN deptno = 10 THEN 'ACCOUNTS'
           WHEN deptno = 20 THEN 'SALES'
           ELSE 'UNKNOWN'  
      END
      = 'SALES'
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';

시험:

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

Oracle은 테이블에서 스캔할 레코드 수를 필터링하기 위해 먼저 where 절을 선택한 후 선택합니다.그 때문에 쿼리가 실패합니다.또한 "Department=" 필터 때문에 쿼리에서 "Accounts or Unknown" 부서가 있는 행을 반환하지 않습니다.판매량"

대신 아래를 시험해 보십시오.엔진에서 쉽게 가져올 수 있습니다.

ename, job을 선택합니다.'세일즈' AS 부문 WHERE DEPTNO = 20;

언급URL : https://stackoverflow.com/questions/6545664/using-case-expression-column-in-where-clause