一尘不染

支持大数的自然排序

sql

我有一些这样的数据:

 id | templateName 
----+--------------
 10 | a
 61 | a
 63 | a
  4 | a
  6 | a
  7 | a
 34 | a
 35 | a
 62 | a
  1 | a
 13 | a
 25 | a
 26 | a
 66 | a
 68 | a
 70 | a
 65 | a
  5 | a1
 73 | a5
  3 | a15
  2 | a15a
 69 | a15b
 64 | a15b4
 74 | a15b21
  8 | a214748364

我正在使用以下代码进行自然排序:

CREATE TYPE ai AS (a text, i int);

select id, "templateName" from daily_templates
order by ARRAY(SELECT ROW(x[1], CASE x[2] WHEN '' THEN '0' ELSE x[2] END)::ai
               FROM regexp_matches("templateName", '(\D*)(\d*)', 'g')  x)
       , "templateName";

就像我上面显示的那样,它的工作原理很好。现在我想支持诸如

a111111111111111111111

这将超出的范围integer。我怎样才能做到这一点?参考:单词和数字混合字符串的人性化或自然数排序


阅读 140

收藏
2021-03-17

共1个答案

一尘不染

它像@clemens建议的那样工作。在复合类型中使用numeric(= decimal):

CREATE TYPE ai AS (a text, i numeric);

db
<>在这里拨弄

int在参考答案中使用的原因是性能。

2021-03-17