像这样的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
。这种行为该如何解释?我该如何对字符进行排序和比较,使它们像整数一样可以一起工作?
有趣的是,将限制条件更改为
x>'B002AACD0A'
时,结果为空。将其更改为x>978123456789
将返回B002AACD0A
。也就是说,在比较时:
B002AACD0A > 978123456789 > 000000000000
但是当进行排序时:
978123456789 > 000000000000 > B002AACD0A
当使用二进制排序明确指定(order by NLSSORT(x,'NLS_SORT=BINARY_AI')
)时,结果为B002AACD0A>978123456789>000000000000
,并与比较的行为匹配。但我仍然不知道为什么会发生这种情况。
NLS_SORT
设置有关(在我的情况下,它是GERMAN
)。但无论如何,我希望在单个查询中,排序和比较的行为方式是相似的... - Peter P