Oracle与Postgres的排序依据

8ftvxx2r  于 2023-08-04  发布在  Oracle
关注(0)|答案(1)|浏览(129)

我在Oracle和Posterre中运行下面的查询,两者都显示了与值的排序有关的不同输出。

with test as (
select 'Summary-Account by User (Using Contact ID)' col1 from dual
    union all
select 'Summary-Account by User by Client by Day (Using Contact ID)' col1 from dual
)
select * from test
order by col1 desc;

字符串
下面是Oracle One
x1c 0d1x的数据
波斯特格雷斯

with test as (
select 'Summary-Account by User (Using Contact ID)' col1
    union all
select 'Summary-Account by User by Client by Day (Using Contact ID)' col1
)
select * from test
order by col1 desc;



Oracle排序规则为AL 32 UTF8,邮政总局的LC_CTYPS为en_US.UTF-8
从数据库的行为来看,这两个版本看起来是相同的。如何解决这个问题?
我读过一些关于POSIX和C的stackoverflow的帖子,在把查询顺序改为**order by col 1 collate“C”desc之后;**结果与Oracle输出相符。
有没有办法永久地应用它?

lzfw57am

lzfw57am1#

AL32UTF8不是排序规则,而是编码(字符集)。
Oracle默认使用“二进制排序规则”,这对应于PostgreSQL中的CPOSIX排序规则。
你有几个选项可以在PostgreSQL中得到类似的结果:

  • 使用LOCALE "C"创建数据库
  • 如果从表中选择,请定义要使用"C"排序规则的列:
ALTER TABLE tab ALTER col1 TYPE text COLLATE "C";

字符串

  • 添加一个显式的COLLATE子句:
ORDER BY col1 COLLATE "C"

相关问题