2014-09-22 5 views
0

그래서 나는 최적화/생성 된 데이터베이스를 제대로 처리하지 못했습니다. where 절에서 디코드를 사용할 수 있다는 것을 알고 있지만 선택 영역에서 디코딩 한 후 where 절에서 값을 사용할 수있는 방법이 있는지 궁금합니다. 기본적으로,이오라클 : DECODE 및 WHERE 절

DECODE(theRow, 'P', 1,'D',2,'T',3, ... (goes on a bit)) AS theRowDecoded 

같은 사례 그렇다고이 그리고 내가 그 행에 전송 될 수있는 것 사이의 값을 선택합니다 (그래서 5 사이라고, 8). 왜 그들이 데이터베이스에서이 열의 숫자를 사용하지 않았는지 확신하지 못했지만 (오히려 프로그래밍 방식으로 더 이해하기 쉬울 것입니다.), 오히려 내가 갖고있는 것과 함께 일해야합니다.

범위를 수행하는 더 좋은 방법은 어디에서 또는 로우 코딩을 사용할 수 있습니까? 나는 DECODE가 단지 같다는 것을 알고 있지만 디코드가있는 범위를 수행하는 좋은 방법이 있기를 바란다.

답변

3

where 절에서 별칭을 사용할 수 없습니다. 두 가지 대안이 있습니다.

하위 쿼리

는 하위 쿼리에 쿼리를 확인하는 A 높은 수준의 별칭을 사용합니다. 원래 값을 사용하기 때문에

SELECT 
    theRowDecoded 
FROM 
    (SELECT 
    DECODE(theRow, .....) as theRowDecoded 
    FROM 
    theTable) 
WHERE 
    theRowDecoded BETWEEN 5 AND 8 

또한 where 절에 대한 인덱스의 사용을 허용, 원래 값 아마도 더 나은

를 사용합니다. 또한 더 짧고 중첩되지 않으므로 틀림없이 읽을 수 있습니다.

SELECT 
    DECODE(theRow, .....) as theRowDecoded 
FROM 
    theTable 
WHERE 
    theRow in ('T', 'X', 'Y', 'Z') 

결국 가상 열

, 숫자에 테이블을 변경하는 것이 더 나은 수 있습니다. 번호는 function based virtual column이 될 수 있습니다. 이렇게하면 숫자 열도 테이블에 존재하며 다른 열로 사용할 수 있습니다. 그 차이는 theRow을 업데이트하면 자동으로 업데이트됩니다.

내가 가상 열에게 자신을 사용하지 않는했지만, 그것은 다음과 같이 작동합니다 :

alter table theTable 
    add theRowDecoded int as generated always (decode(theRow, .....)) virtual; 

실제 열 대신 가상 컬럼의

, 당신은 또한 여분의 열을 추가하고 유지할 수 있습니다 두 개는 방아쇠와 동기화됩니다. 또는 theRow을 모두 삭제할 수 있습니다. 능력과 권한 및이 데이터베이스를 사용하는 응용 프로그램에 따라 그리 쉽지 않을 수도 있으므로 새 열을 도입하고 이전 열을 가상 열로 만들 것을 고려해 볼 수 있습니다. 새 숫자 열을 사용하도록 소프트웨어가 업데이트되는 전환 기간 동안 읽기 전용 레거시 열.

+0

감사합니다 :) 매우 유익하고 그게 나를 위해 작동합니다. 나중에 가상 열을 설정하겠습니다.우리 그룹의 데이터베이스에서 설정해야합니다. (공식 시설은 여전히 ​​10g을 사용하기 때문에,하지만 우리가 원하는대로 받아들이고 12c 데이터베이스에서 구조 조정하는 것이 좋습니다.) –

0

필드 목록에서 동일한 표현식을 반복 할 수 있습니다. Where 절에서 별칭을 사용할 수 있는지 여부는 알 수 없습니다 (시도해야 함).

할 수없는 작업 (afaik)은 where 절의 표현식에 별칭을 지정하고 다른 곳에서 사용합니다.