"order by" postgres 和 oracle 有不同的结果

"order by" postgres and oracle have different results

当我使用 oracle 数据库中的 varchar 字段进行“排序依据”时 这是结果 数据:

1>33
1>31>33
1>31
112
11
1

有什么办法可以达到下面想要的效果 数据:

112
11
1>33
1>31>33
1>31
1

对于 postgres,它工作得很好,但对于其他数据库,它不能正常工作

如果有人可以帮助我,非常感谢

Oracle_19

Postgres_13

来源:

create table test(
data char(50)
)

insert into test values('112');
insert into test values('11');
insert into test values('1>33');
insert into test values('1>31>33');
insert into test values('1>31');
insert into test values('1');

select * from test order by data desc

我不假装对排序规则有很多了解,但是您可以使用 UCA collation and variable characters and weighting 在 Oracle 中获得您想要的结果,或者对于特定的查询 nlssort():

select * from test order by nlssort(data, 'NLS_SORT=UCA0700_DUCET_VN') desc

或通过设置 NLS_SORT 会话(或系统)参数:

alter session set nls_sort = UCA0700_DUCET_VN;
select * from test order by data desc

两者都给出了你想要的结果:

DATA
----------
112                                               
11                                                
1>33                                              
1>31>33                                           
1>31                                              
1        

db<>fiddle

大概您的 PostgreSQL 环境配置为执行类似操作。


从未使用过 PostgreSQL,但看起来这个排序规则也是一样的:

select * from test order by data collate "vi-VN-x-icu" desc

db<>fiddle