ORDER BY DECODE单个列上的查询(BLAH,[列号])。它是如何工作的?
题
您好我需要帮助明白那张像下面这样一个查询的解码部分。
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“-1”,“0”和“100”和ORDER BY似乎失败0和100为什么它与-1工作或任何其他数字的?
希望有人可以给我讲解一下。谢谢!
解决方案
它创建将被用于排序的集合。
如果animal_type = l_type_to_be_matched,使用-1作为该行结果,排序值 否则,如果animal_type = l_current_type,使用0作为该行结果的排序值 否则,如果axt.type_search_priority为null,则使用100作为该行结果的排序值 其他使用axt.type_search_priority作为该行的排序值。
它提供了一种有条件排序cirteria的。经常用来保证某些项始终在一个有序集合的顶部或底部。
其他提示
在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')
参照您的问题的这一部分:
我在想,DECODE返回 不同的列数,以ORDER BY 与我试图用试验 不同的简单的单柱选择 在一些其它表与订单 '-1', '0' 和 '100' 和ORDER BY 似乎是失败的0和100为什么 它与-1工作或任何其他的 号码?
您混淆是可以理解的;但没有,由解码返回的值不会被解释为列数。
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列的表中的值
SELECT * FROM table ORDER BY TO_NUMBER('1')
将所有行上的恒定值1进行排序。
我还没有彻底测试了这一点,但看一些执行计划,看来,你甚至可以指定一个非整数数字文字,这将是(四舍五入),作为列数。
SELECT * FROM table ORDER BY 1.5
似乎排序的第一列的值。