在Oracle中的ORDER BY之后+0是什么意思

Luc*_*s B 9 sql sorting oracle oracle9i

我试图理解这个Oracle 9i查询末尾的+0是什么意思:

SELECT /*+ INDEX (a CODE_ZIP_CODE_IX) */ 
       a.city, 
       a.state, 
       LPAD(a.code,5,0)  ZipCode, 
       b.County_Name     CoName, 
       c.Description     RegDesc, 
       d.Description     RegTypeDesc  
FROM TBL_CODE_ZIP a, 
     TBL_CODE_COUNTY b, 
     TBL_CODE_REGION c, 
     TBL_CODE_REGION_TYPE d  
WHERE a.City = 'LONDONDERRY' 
    AND a.State = 'NH' 
    AND lpad(a.Code,5,0) = '03038' 
    AND a.Region_Type_Code = 1 
    AND b.County(+) = a.County_Code  
    AND b.STATE(+) = a.STATE 
    AND c.Code(+) = a.Region_Code  
    AND d.Code(+) = a.Region_Type_Code  
ORDER BY a.Code +0
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

注意:我不认为它与升序或降序有关,因为我无法在a.Code和+0之间添加asc或desc,我可以在+0之后添加asc或desc

Rob*_*ijk 8

+ 0是基于规则的优化,这使得它不可能对数字列使用索引的日子一招回来.同样,他们|| ''为字母数字列做了一个.

对于你的查询,我检查后得出的唯一结论是它的创建者正在努力表现.如果(这是我的假设)索引CODE_ZIP_CODE_IX是TBL_CODE_ZIP(代码)的索引,那么查询将不会使用它,即使它被暗示使用它.创建者可能不知道通过使用LPAD(a.code,5,0)而不是a.code,不能使用索引.order by子句获取其中间结果集(驻留在内存中)并对其进行排序.不需要索引.但+ 0看起来他似乎想要禁用它.

因此,使用的技巧是无效的,现在只是误导,正如你已经发现的那样.

问候,Rob.

PS1:最好使用LPAD(TO_CHAR(a.code),5,'0')或TO_CHAR(a.code,'fm00009').然后很清楚你在使用数据类型做什么.

PS2:您的查询可能会受益于在LPAD上使用基于函数的索引(TO_CHAR(a.code),5,'0'),或者您用来填充邮政编码的任何表达式.


Mar*_*ker 7

我的猜测是,a.code是包含数字字符串VARCHAR2,而+0有效它铸造了许多这样的排序将是数字,而不是字母

您应该能够在+0 之后添加ASC/DESC

  • 似乎有一种奇怪的方式 - 以这种方式做这样做有什么好处,而不仅仅是使用`to_number(a.code)`? (2认同)