【问题标题】:Weird Oracle orderBy behavior on String with * and (带有 * 和 ( 的字符串上的奇怪 Oracle order By 行为
【发布时间】:2016-06-01 22:26:40
【问题描述】:

如果我运行这个查询:

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);

【问题讨论】:

  • 那个表达真的很有帮助

标签: oracle sql-order-by


【解决方案1】:

这一定与法语 nls_sort 的工作方式有关。但是,您可以使用 order by 中的 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      

【讨论】:

  • 谢谢,这确实在 SQL 中运行良好。现在我想知道如何通过 JPA 标准 api 做到这一点
  • this question 的答案的最底层有帮助吗?
  • 成功了,谢谢。这是要使用的顺序表达式 builder.function("nlssort", String.class, yourColumnExpression, builder.literal("nls_sort=binary"));
猜你喜欢
  • 2014-10-12
  • 1970-01-01
  • 2020-01-22
  • 2011-11-15
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多