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