3

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

提前谢谢各位。

4

2 回答 2

4

这是语言排序的效果:

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

于 2011-04-16T07:26:48.943 回答
1

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

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

TXT 
--- 
&   
N   
P   

TXT 
--- 
&Z  
N   
P   
于 2011-04-16T06:27:35.557 回答