PostgreSQL如何让含负号数字的varchar列按数值排序?
解决VARCHAR列按带负号数值排序的问题
你用的en-u-kn-true排序规则仅开启了数字数值排序,但它只会识别连续的数字片段,不会把字符串中独立的负号和后续数字结合成负数处理,所以达不到预期效果。这里提供两种可行方案:
方案一:提取带符号数字后排序(最直接可靠)
通过正则表达式提取字符串中的带符号数字部分,转换为数值类型后排序,能精准满足你的需求:
SELECT * FROM my_table ORDER BY -- 提取第一个带符号的数字片段,转为数值;无数字则按0排序 (COALESCE(regexp_match(a_field, '-?\d+'), ARRAY['0']))[1]::numeric, -- 数值相同时,按原字符串排序 a_field;
这个方法会把aaa-10bbb提取出-10,aaa-2bbb提取出-2,aaa2bbb提取出2,排序结果正好是aaa-10bbb < aaa-2bbb < aaa2bbb。
方案二:自定义ICU排序规则(仅适用于负号紧邻数字的场景)
如果你的字符串中负号直接跟在数字前(比如-10aaa),可以尝试调整ICU规则让负号作为数值符号被识别,但如果负号和数字之间有其他字符(比如你的例子aaa-10bbb),这种方法无效。示例规则如下:
CREATE COLLATION custom_collation ( provider = icu, locale = 'en-u-kn-true', rules = '&- << 0 << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 8 << 9' );
内容的提问来源于stack exchange,提问作者androberz
相关产品推荐
相关产品推荐

