奇怪的Oracle orderBy对String的行为*和(

时间:2016-05-27 16:07:32

标签: oracle sql-order-by

如果我运行此查询:

select distinct column_value as test 
from table(sys.dbms_debug_vc2coll('AFGHANISTAN','*AFRIQUE','(AUCUN)','ITALIE','**MONDE')) 
order by test asc;

我希望:

(AUCUN)
**MONDE
*AFRIQUE
AFGHANISTAN
ITALIE

或者

AFGHANISTAN
ITALIE
*AFRIQUE
**MONDE
(AUCUN)

但这就是我得到的:

AFGHANISTAN
*AFRIQUE
(AUCUN)
ITALIE
**MONDE

所以它看起来完全忽略了(*

如果我将会话NLS_SORT参数从FRENCH更改为BINARY

alter session set NLS_SORT=BINARY;

订单没问题。

但我真的不应该改变我的客户数据库设置,是否有一些理由在默认情况下获得这个奇怪的订单?

我是否可以通过JPA条件API执行任何操作以获得良好的顺序而无需更改数据库?

编辑:这是用于订单的表达式:

// My Original field expression used for the sort
Expression<String> myFieldExp = root.get("mySortField");
Expression<String> sortExpWithNLSfix = builder.function("nlssort", String.class, myFieldExp , builder.literal("nls_sort=binary"));
myCritQuery.orderBy(builder.asc(sortExpWithNLSfix);

1 个答案:

答案 0 :(得分:2)

这必须与法国nls_sort的工作方式有关。但是,您可以按顺序使用nlssort函数来更改查询的排序模式,如下所示:

alter session set nls_sort=french;

select distinct column_value as test
from table(sys.dbms_debug_vc2coll ('AFGHANISTAN',
                                   '*AFRIQUE',
                                   '(AUCUN)',
                                   'ITALIE',
                                   '**MONDE'))
order by test asc;

TEST          
--------------
AFGHANISTAN   
*AFRIQUE      
(AUCUN)       
ITALIE        
**MONDE

select distinct column_value as test
from table(sys.dbms_debug_vc2coll ('AFGHANISTAN',
                                   '*AFRIQUE',
                                   '(AUCUN)',
                                   'ITALIE',
                                   '**MONDE'))
order by nlssort(test, 'nls_sort=binary') asc;

TEST          
--------------
(AUCUN)       
**MONDE       
*AFRIQUE      
AFGHANISTAN   
ITALIE