在Oracle ORDER BY中忽略了&符号(&)字符

时间:2011-04-15 22:28:16

标签: oracle sql-order-by ignore ampersand

我正在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子句没有考虑这个问题。有谁知道这是预期的行为还是我错过了一些配置步骤?我知道需要为了插入或更新而逃避&符号。但事情是这个角色已经在桌子上了!

先谢谢你们。

2 个答案:

答案 0 :(得分:3)

这是语言排序的效果:

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值进行排序。

答案 1 :(得分:1)

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

我在Oracle 10g上获得以下内容,NLS_LANGUAGE = AMERICAN和NLS_SORT =(null)。

TXT 
--- 
&   
N   
P   

TXT 
--- 
&Z  
N   
P