【问题标题】:Ampersand (&) character is being ignored in Oracle ORDER BYOracle ORDER BY 中忽略与号 (&) 字符
【发布时间】:2011-08-06 16:17:28
【问题描述】:

我正在 Oracle 中运行一个查询,该查询按可能具有与号的值的列排序。但是,排序算法似乎忽略了&符号。

例如:

select * from (
    select '&' txt from dual
    union
    select 'P' txt from dual
    union
    select 'N' txt from dual
)
order by txt

打印准确(我猜是正确的):

&
N
P

但是,如果我将带有 '&' 的文本更改为 '&Z',结果会发生变化:

select * from (
    select '&'||'Z' txt from dual // concatenating just to
                                  // avoid variable substitution
    union
    select 'P' txt from dual
    union
    select 'N' txt from dual
)
order by txt

结果是:

N
P
&Z

如果我将“Z”更改为“A”,那么结果是:

&A
N
P

ORDER BY 子句似乎没有考虑“&”。有谁知道这是预期的行为还是我缺少一些配置步骤?我知道需要为插入或更新转义与号。但问题是角色已经在桌子上了!

提前谢谢各位。

【问题讨论】:

    标签: oracle sql-order-by ampersand


    【解决方案1】:

    是语言排序的效果:

    SQL> alter session set nls_sort=binary;
    
    Session altered.
    
    SQL> get afiedt.buf
      1  select * from (
      2  select '&' txt from dual
      3  union
      4  select '&'||'Z' txt from dual
      5  union
      6  select '&'||'A' txt from dual
      7  union
      8  select 'P' txt from dual
      9  union
     10  select 'N' txt from dual
     11  )
     12* order by txt
    SQL> /
    
    TX
    --
    &
    &A
    &Z
    N
    P
    
    SQL> alter session set nls_sort = 'Dutch';
    
    Session altered.
    
    SQL> get afiedt.buf
      1  select * from (
      2  select '&' txt from dual
      3  union
      4  select '&'||'Z' txt from dual
      5  union
      6  select '&'||'A' txt from dual
      7  union
      8  select 'P' txt from dual
      9  union
     10  select 'N' txt from dual
     11  )
     12* order by txt
    SQL> /
    
    TX
    --
    &
    &A
    N
    P
    &Z
    

    对于您要排序的语言确实有所不同。某些字符根据其语言具有不同的值。对于二进制,您使用 ascii 值进行排序。

    【讨论】:

    • 语言排序有ignorable characters,但不知道是否可以包括&作为标点符号。
    • 很好地阅读了与符号 glossographia.wordpress.com/2009/01/13/…> 并不是说​​它使任何事情变得更清晰,但它是一件复杂的事情。
    • 另见 websters-online-dictionary.org/definitions/…>,它被列为标点符号。
    • 谢谢@ik_zelf,它就像你说的那样工作。 @alex-poole 我会看看你发布的可忽略字符页面。
    【解决方案2】:

    这可能取决于您的 NLS_LANGUAGE 和 NLS_SORT 设置。

    我在 Oracle 10g 上得到以下信息,NLS_LANGUAGE = AMERICAN 和 NLS_SORT = (null)。

    TXT 
    --- 
    &   
    N   
    P   
    
    TXT 
    --- 
    &Z  
    N   
    P   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 2010-11-20
      • 2012-05-10
      相关资源
      最近更新 更多