12

嗨,我需要帮助来理解查询的解码部分,如下所示。

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

由于此查询仅返回 1 个查询,我对 ORDER BY 如何与 DECODE 提供的不同的不存在的列号一起工作感到有些困惑。该查询作为一个游标,在给定动物助记符、当前动物类型和要匹配的类型的情况下查找相关动物的唯一代码。

我在想 DECODE 将不同的列号返回给 ORDER BY,我尝试在其他一些表上尝试不同的简单单列选择,其中 ORDER by '-1'、'0' 和 '100' 并且 ORDER by 似乎0 和 100 失败。为什么它适用于 -1 或任何其他数字?

希望有人可以向我解释这一点。谢谢!

4

3 回答 3

6

ORDER BY 可以使用三个表达式之一。首先是选择列表的别名,其次是选择列表中列的编号,或者第三是可以使用源表中的零个或多个列的 SQL 表达式。

因此,当您使用 ORDER BY SUBSTR(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')
于 2010-02-19T01:00:51.217 回答
4

它创建将用于排序的集合。

如果animal_type = l_type_to_be_matched,则使用-1作为该行的排序值,
否则如果animal_type = l_current_type,则使用0作为该行的排序值,
否则如果axt.type_search_priority为空,则使用100作为该行的排序值,
否则使用axt.type_search_priority 作为该行的排序值。

它给出了一种条件排序规则。通常用于确保某些项目始终位于排序集的顶部或底部。

于 2010-02-19T00:36:00.917 回答
1

参考您问题的这一部分:

我在想 DECODE 将不同的列号返回给 ORDER BY,我尝试在其他一些表上尝试不同的简单单列选择,其中 ORDER by '-1'、'0' 和 '100' 并且 ORDER by 似乎0 和 100 失败。为什么它适用于 -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 0将返回错误,因为 0 是无效的列号。

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似乎对第一列的值进行排序。

于 2010-02-23T15:03:02.333 回答