Postgresql先用数字进行自然排序



在Postgres中,我需要用自然顺序对文本进行排序,但有一个例外——如果字符串只有数字,则应将其放在顶部。所以我需要这样的订单:

["98", "125", "134", "148", "265", "634", "1233", "5231",  "1m1ds", "1m2", "1m3", "1n3", "1w3r", "2m3", "2n3ds", "9t6","12gh", "13jy","25hg", "123y", "des2", "nme", "wer5"]

我试过这个:

CREATE COLLATION IF NOT EXISTS numeric (provider = icu, locale = 'en@colNumeric=yes');
ALTER TABLE "baggage_belts" ALTER COLUMN "name" type TEXT COLLATE numeric;

还可以,但数字被混合成数字+文本:

[1m1ds, 1m2, 1m3, 1n3, 1w3r, 2m3, 2n3ds, 9t6, 12gh, 13jy, 25hg, 98, 123y, 125, 134, 148, 265, 634, 1233, 5231, des2, nme, wer5]

任何人都知道它是否可能与";"空";数字优先?

然后应该添加第二个检查非数字的ORDER BY表达式:

ORDER BY name ~ '[^[:digit:]]', name

这依赖于FALSE < TRUE,您可以通过像ORDER BY子句一样定义的两列索引来支持它。

最后,我用@Formula:在Entity中创建了额外的属性,从而解决了这个问题

@Formula(value = "name ~ '[^[:digit:]]'")
public String nonDigitName;

现在我有

Sort.by(Sort.Direction.ASC, "nonDigitName", "name")

我还有一个挑战。我想将此属性移动到另一个类MySortClass,并使我的基本实体类扩展MySortClass。但当我搬家时,我有

Unable to locate Attribute  with the the given name [nonDigitName] on this ManagedType [pl.ppl.szopl.app.baggagebelt.BaggageBeltEntity]

是否有可能按继承字段排序?

最新更新