Ordem por decodificação (blá, [número da coluna]) em uma única consulta de coluna. Como funciona?

StackOverflow https://stackoverflow.com/questions/2293238

  •  21-09-2019
  •  | 
  •  

Pergunta

Olá, preciso de ajuda para entender a parte decodificadora de uma consulta que é algo como o seguinte.

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

Como esta consulta retorna apenas 1 consulta, estou um pouco perplexo sobre como o pedido funciona com os diferentes números de colunas inexistentes fornecidos pela decodificação. A consulta funciona como um cursor para encontrar um código único para o animal em questão, dado a um animal mnemônico o tipo atual de animal e o tipo a ser combinado.

Estou pensando que decodificar retorna os diferentes números de colunas para encomendar e tentei experimentar uma coluna única simples diferente seleciona em algumas outras tabelas com ordem por '-1', '0' e '100' e a ordem por parece falhar para 0 e 100. Por que ele funciona com -1 ou algum dos outros números?

Espero que alguém possa me explicar isso. Obrigado!

Foi útil?

Solução

Ele cria o conjunto que será usado para pedir.

Se animal_type = l_type_to_be_matched, use um -1 como o valor de classificação para essa linha
caso contrário, se animal_type = l_current_type, use 0 como o valor de classificação dessa linha
caso contrário, se axt.type_search_priority for nulo, use 100 como o valor de classificação dessa linha
caso contrário, use axt.type_search_priority como valor de classificação para essa linha.

Dá um tipo de Cirteria de classificação condicional. Freqüentemente usado para garantir que certos itens estejam sempre na parte superior ou inferior de um conjunto classificado.

Outras dicas

A ordem pode usar uma das três expressões. Em primeiro lugar, um alias da lista de seleção, em segundo lugar, o número de uma coluna na lista de seleção ou em terceiro lugar uma expressão SQL que pode usar zero ou mais colunas nas tabelas de origem.

Portanto, quando você usa a ordem por substrato (col, 2,10), você solicita uma substring de 10 caracteres do valor da coluna, começando pelo segundo caractere.

Da mesma forma, quando uso

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

Você traduz cão em valor 1, gato em valor 2, enguia no valor 3 e outros em valor 5. Então encomenda pelo valor numérico resultante (ou seja, cachorro primeiro, depois gato, depois enguia, finalmente qualquer outra coisa).

Você pode alcançar o mesmo pedido usando

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

Referindo -se a esta parte da sua pergunta:

Estou pensando que decodificar retorna os diferentes números de colunas para encomendar e tentei experimentar uma coluna única simples diferente seleciona em algumas outras tabelas com ordem por '-1', '0' e '100' e a ordem por parece falhar para 0 e 100. Por que ele funciona com -1 ou algum dos outros números?

Sua confusão é compreensível; Mas não, os valores retornados pela decodificação não são interpretados como números de coluna.

O Oracle suporta um pouco de atalho sintático, no qual as colunas do conjunto de resultados podem ser referidas posicionalmente em uma cláusula por ordem por cláusula. Então, por exemplo, isso:

SELECT a, b FROM some_table ORDER BY 1,2

é o mesmo que:

SELECT a, b FROM some_table ORDER BY a,b

No entanto, essa notação posicional só pode ser feita com literais inteiros não negativos. Se a ordem por incluir uma expressão que produz um valor numérico, ela não será interpretada como um número de coluna, mas como um valor real a ser classificado. Além disso, os literais numéricos negativos são interpretados como valores de classificação, não como números de colunas.

SELECT * FROM table ORDER BY -1 classificará todas as linhas no valor constante -1 (efetivamente sem classificação).

SELECT * FROM table ORDER BY 0 retornará um erro porque 0 é um número de coluna inválido.

SELECT * FROM table ORDER BY 1 Classificará todas as linhas no valor da primeira coluna da tabela.

SELECT * FROM table ORDER BY 100 Classificará todas as linhas no valor da 100ª coluna na tabela ou retornará um erro se houver menos de 100 colunas.

SELECT * FROM table ORDER BY TO_NUMBER('1') classificará todas as linhas no valor constante 1.

Não testei isso minuciosamente, mas, olhando para alguns planos de execução, parece que você pode até especificar um literal numérico não inteiro e será arredondado e usado como número de coluna.

SELECT * FROM table ORDER BY 1.5 parece classificar o valor da primeira coluna.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top