it-source

단일 열 쿼리에 대한 DECODE(BLAH, [COLUMNT NUMBER])를 사용합니다.어떻게 작동합니까?

criticalcode 2023. 7. 25. 21:06
반응형

단일 열 쿼리에 대한 DECODE(BLAH, [COLUMNT NUMBER])를 사용합니다.어떻게 작동합니까?

안녕하세요. 다음과 같은 질문의 디코딩 부분을 이해하려면 도움이 필요합니다.

SELECT ax.animal_code    
FROM  raw_animal_xref ax,
      animal_xref_type axt
WHERE ax.animal_mnemonic = l_animal_mnemonic -- Example 'COUGAR'
AND   ax.animal_code_type = axt.animal_code_type
ORDER BY DECODE (animal_type, 
                l_type_to_be_matched, -1, -- Example 'CATS'
                l_current_type, 0, -- Example 'BIG CATS'
                nvl(axt.type_search_priority, 100)) ASC; -- EXAMPLE 'Big Cats' Priority is 1

이 쿼리는 하나의 쿼리만 반환하기 때문에 DECODE에서 제공하는 다른 존재하지 않는 열 번호와 함께 ORDER BY가 작동하는 방식에 대해 조금 당황스럽습니다.쿼리는 현재 동물 유형과 일치시킬 유형이 지정된 동물 니모닉이 주어진 문제의 동물에 대한 고유 코드를 찾기 위한 커서 역할을 합니다.

DECODE가 서로 다른 열 번호를 ORDER BY로 반환하는 것으로 생각하고 있으며, 다른 테이블에서 '-1', '0', '100'으로 다른 단순 단일 열 선택을 실험해 보았는데, 0과 100에 대한 ORDER BY가 실패한 것 같습니다.왜 -1이나 다른 숫자들과 함께 작동합니까?

누군가 나에게 이것을 설명해주길 바랍니다.감사합니다!

ORDER BY는 세 가지 식을 사용할 수 있습니다.첫째, 선택 목록의 별칭, 둘째, 선택 목록의 열 수 또는 셋째, 원본 테이블의 열을 0개 이상 사용할 수 있는 SQL 식입니다.

따라서 ORDER BY Substres(col,2,10)를 사용할 때 열 값의 하위 문자열을 두 번째 문자부터 시작하여 10자로 정렬합니다.

유사하게 사용할 때

ORDER BY decode(col,'DOG',1,'CAT',2,'EEL', 3, 5)

당신은 DOG를 1 값으로, CAT를 2 값으로, EEL을 3 값으로, 다른 것들을 5 값으로 변환합니다.그런 다음 결과 숫자 값(예: DOG 먼저, CAT, EEL, 마지막으로 다른 모든 항목)을 기준으로 정렬합니다.

다음을 사용하여 동일한 주문을 수행할 수 있습니다.

ORDER BY decode(col,'DOG','A','CAT','B','EEL', 'C', 'D')

이것은 주문에 사용될 세트를 만듭니다.

animal_type = l_type_to_be_message이면 해당 행의 정렬 값으로 -1을 사용합니다.
animal_type = l_current_type인 경우 해당 행의 정렬 값으로 0을 사용합니다.
그렇지 않으면 xt.type_search_priority가 null이면 해당 행의 정렬 값으로 100을 사용합니다.
그렇지 않으면 해당 행의 정렬 값으로 xt.type_search_priority를 사용합니다.

일종의 조건부 분류 기준을 제공합니다.종종 특정 항목이 항상 정렬된 집합의 맨 위 또는 맨 아래에 있도록 하는 데 사용됩니다.

질문의 이 부분을 참조하십시오.

DECODE가 서로 다른 열 번호를 ORDER BY로 반환하는 것으로 생각하고 있으며, 다른 테이블에서 '-1', '0', '100'으로 다른 단순 단일 열 선택을 실험해 보았는데, 0과 100에 대한 ORDER BY가 실패한 것 같습니다.왜 -1이나 다른 숫자들과 함께 작동합니까?

혼동은 이해할 수 있지만, DECODE에서 반환되는 값은 열 번호로 해석되지 않습니다.

Oracle은 결과 집합의 열을 ORDER BY 절에서 위치적으로 참조할 수 있는 약간의 구문적인 바로 가기를 지원합니다.예를 들어 다음과 같습니다.

SELECT a, b FROM some_table ORDER BY 1,2

다음과 같습니다.

SELECT a, b FROM some_table ORDER BY a,b

그러나 이 위치 표기법은 음이 아닌 정수 리터럴에서만 수행할 수 있습니다.ORDER BY에 숫자 값을 생성하는 식이 포함되어 있으면 열 번호로 해석되지 않고 정렬할 실제 값으로 해석됩니다.또한 음수 리터럴은 열 번호가 아닌 정렬 값으로 해석됩니다.

SELECT * FROM table ORDER BY -1상수 값 -1의 모든 행을 정렬합니다(실제로 정렬 없음).

SELECT * FROM table ORDER BY 00은 잘못된 열 번호이므로 오류를 반환합니다.

SELECT * FROM table ORDER BY 1테이블의 첫 번째 열 값에 있는 모든 행을 정렬합니다.

SELECT * FROM table ORDER BY 100테이블의 100번째 열 값에 있는 모든 행을 정렬하거나 100개 미만의 열이 있으면 오류를 반환합니다.

SELECT * FROM table ORDER BY TO_NUMBER('1')상수 값 1의 모든 행을 정렬합니다.

제가 이것을 완전히 테스트하지는 않았지만 일부 실행 계획을 보면 정수가 아닌 숫자 리터럴까지 지정할 수 있는 것으로 나타나고 반올림되어 열 번호로 사용됩니다.

SELECT * FROM table ORDER BY 1.5첫 번째 열의 값을 정렬하는 것으로 나타납니다.

언급URL : https://stackoverflow.com/questions/2293238/order-by-decodeblah-column-number-on-a-single-column-query-how-does-it-wor

반응형