Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Oracle';s varchar排序顺序与varchar比较的行为不匹配?_Oracle_Sorting_Compare - Fatal编程技术网

为什么Oracle';s varchar排序顺序与varchar比较的行为不匹配?

为什么Oracle';s varchar排序顺序与varchar比较的行为不匹配?,oracle,sorting,compare,Oracle,Sorting,Compare,SQL语句,如: select * from ( select '000000000000' as x from dual union select '978123456789' as x from dual union select 'B002AACD0A' as x from dual ) /*where x>'000000000000'*/ order by x; 收益率: B002AACD0A 000000000000 978123456789 取消注释W

SQL语句,如:

select * from (
  select '000000000000' as x from dual
  union
  select '978123456789' as x from dual
  union 
  select 'B002AACD0A' as x from dual
) /*where x>'000000000000'*/ order by x;
收益率:

B002AACD0A
000000000000
978123456789
取消注释WHERE限制后,结果是:

B002AACD0A
978123456789
我本来希望结果只是
978123456789
,因为在不受限制地运行查询时,
B002AACD0A
000000000000
之前返回

如何解释这种行为?我该如何对varchar进行排序和比较,以便它们可以像处理整数一样协同工作

有趣的是,将限制更改为“B002AACD0A”时,结果为空。将其更改为978123456789将返回
B002AACD0A

即在比较时:

B002AACD0A > 978123456789 > 000000000000
但在排序时:

978123456789 > 000000000000 > B002AACD0A 
明确使用二进制排序时(
orderbyNLSSORT(x,'NLS_sort=binary_AI')
),结果是
B002AACD0A>978123456789>000000000000
,并匹配比较行为。但我仍然不知道为什么会发生这种情况。

彼得

排序的行为由session参数调节,而比较的行为则取决于该参数。你一定有错配

我使用以下参数获得与您相同的结果:

SQL> SELECT *
  2    FROM nls_session_parameters
  3   WHERE parameter IN ('NLS_COMP', 'NLS_SORT');

PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_SORT                       FRENCH
NLS_COMP                       BINARY
但是,当两者匹配时,结果是一致的:

SQL> alter session set nls_comp=LINGUISTIC;

Session altered

SQL> select * from (
  2    select '000000000000' as x from dual
  3    union
  4    select '978123456789' as x from dual
  5    union
  6    select 'B002AACD0A' as x from dual
  7  ) /*where x>'000000000000'*/ order by x;

X
------------
B002AACD0A
000000000000
978123456789

SQL> select * from (
  2    select '000000000000' as x from dual
  3    union
  4    select '978123456789' as x from dual
  5    union
  6    select 'B002AACD0A' as x from dual
  7  ) where x > '000000000000' order by x;

X
------------
978123456789

您使用的是什么版本的oracle?我看到了非常不同的东西。。。第一次查询得到000000000000978123456789,B002AACD0A,然后在where未注释时得到978123456789,B002AACD0A。我的版本是10.2.0.3.0。我正在使用10.2.0.4.0。看到排序行为的不同,我并不感到惊讶,这可能与
NLS\u排序
设置有关(在我的例子中,它是
德语
)。但无论如何,我希望排序和比较在单个查询中以类似的方式运行…9.2.0.7.0、10.2.0.1.0、11.2.0.1.0和11.1.0.6.0(不问)都返回000000、978123456789、B002AACD0A…感谢您的检查。仅在我的数据库上似乎是一种奇怪的行为:(太好了!非常感谢您指出这一点,我不知道有一个名为NLS_COMP的参数。