[SQL] where 절에서 사용하는 '경우의 표현 열'
SQLwhere 절에서 사용하는 '경우의 표현 열'
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.이 오류의 원인은 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.테이블 컬럼 "부서"를 포함하지 않으며, 따라서 당신은 당신의 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.나를 위해이 작품 :
나를 위해이 작품 :
SELECT ename, job FROM emp WHERE CASE WHEN deptno = 10 THEN 'ACCOUNTS' WHEN deptno = 20 THEN 'SALES' ELSE 'UNKNOWN' END = 'SALES'
-
==============================
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.시험:
시험:
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.오라클은 전에 먼저 쿼리가 실패하는 이유입니다 선택 where 절에 대한 이동하여 레코드의 수는 테이블에서 검사 할 필터링을 시도합니다. 또한, 쿼리에 부서 행이 반환되지 않을 것이다 - 때문에 필터의 "계정 또는 알 수 없음"부서 = "판매"
오라클은 전에 먼저 쿼리가 실패하는 이유입니다 선택 where 절에 대한 이동하여 레코드의 수는 테이블에서 검사 할 필터링을 시도합니다. 또한, 쿼리에 부서 행이 반환되지 않을 것이다 - 때문에 필터의 "계정 또는 알 수 없음"부서 = "판매"
엔진에 의해 인출하기 쉬운 것, 대신 아래에보십시오 :
SELECT ENAME, 직업, 'SALES'AS 부서 보낸 사람 EMP WHERE DEPTNO = 20;
from https://stackoverflow.com/questions/6545664/using-case-expression-column-in-where-clause by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 MDF 데이터베이스 파일에 연결합니까? (0) | 2020.04.02 |
---|---|
[SQL] 텍스트 필드의 단어 수 통계를 결정하기 위해 SQL을 사용하여 (0) | 2020.04.02 |
[SQL] 어떻게 SQL 작업 SSIS 실행에서 매개 변수로 변수를 전달하는 방법? (0) | 2020.04.02 |
[SQL] 어떻게 PostgreSQL의에서 (설치) DBLINK를 사용 하는가? (0) | 2020.04.01 |
[SQL] 모든 맥주를 여러 TSOLUMNS (0) | 2020.04.01 |