java排序和oracle排序,Java中的Oracle等效排序

我想按字母顺序对Java字符串进行排序.排序应该类似于Oracle SQL order by.我曾尝试使用Java Collat​​or,但它优先考虑大字母上的小写字母.非英文字母也存在问题……

例如:

select * from TABLE1 order by COLUMN1;

按以下顺序返回字符串:A,a,Á,á,Ä,ä,B,b,C,C(对我来说是正确的)

Collections.sort(strings, Collator.getInstance());

订购这样的字符串:a,A,á,ä,Ä,Á,b,B,C,C(á,ä,Ä,Á顺序有问题)

(两种情况下的语言环境相同)

我不想输入整个字母表,因为我会忘记一些特别的字母.来自许多欧洲国家的许多不同的人将使用该申请.

解决方法:

很高兴知道你想要重现的确切排序,即NLS_SORT的确切值.你可以通过执行找到

SELECT SYS_CONTEXT ('USERENV', 'NLS_SORT') from SYS.DUAL;

你正在使用的那种产生

A, a, Á, á, Ä, ä, B, b, C, c

目前尚不清楚输入的顺序是什么.

>它把A放在a之前.这很奇怪.我推断它实际上不是更喜欢A而是认为它们是相同的,即不区分大小写.

>它在带有重音符号的字母之前添加了非重音字母,因此我推断它的重音敏感.

GENERIC_M_CI的NLS_SORT符合该法案.您可以在oracle中运行它来检查:

[...] ORDER BY NLSSORT(, 'NLS_SORT=GENERIC_M_CI');

Java Collat​​or有一个setStrength()方法,它接受值PRIMARY,SECONDARY,TERTIARY和IDENTICAL.

确切的解释取决于语言环境,但javadocs给出了一个例子

>主要优势仅区分a和b.

>次要力量也区分a和á.

>三级强度也区分a和A.

>只有字符绝对相同才能满足相同的强度.

所以一个有力量SECONDARY的Collat​​or应该可以为你服务.

在我的机器上,使用en_US默认语言环境,我尝试了这个:

List strings = Arrays.asList("A", "Ä", "Á", "B", "C", "a", "á", "ä", "b", "c");

Collator collator = Collator.getInstance();

collator.setStrength(Collator.SECONDARY);

Collections.sort(strings, collator);

System.out.println(strings);

打印

[A, a, Á, á, Ä, ä, B, b, C, c]

(但是如果你把a放在A之前,它就会保持原来的顺序.)

标签:java,sorting,sql,sql-order-by,oracle

来源: https://codeday.me/bug/20190528/1171968.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值