在regexp_replace中使用lpad[英] Using lpad in regexp_replace

本文是小编为大家收集整理的关于在regexp_replace中使用lpad的处理方法,想解了在regexp_replace中使用lpad的问题怎么解决?在regexp_replace中使用lpad问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在使用 PostgreSQL 9.5 并且有一个表,其中包含一个带有编号扩展名的"area_name"文本列:

area_name
----------------
AREA
AREA EXT
AREA EXT 1
AREA EXT 5
AREA EXT 49
AREA EXT 50

我想通过扩展对结果进行数字排序,如上所示.

我尝试使用 regexp_replace 将数字填充为 0,但使用长度为 4 会在数字前面添加 2 个 0,无论它是 1 位还是 2 位!

create table ext_test (
    area_name text
);

insert into ext_test values
  ('AREA'),
  ('AREA EXT'),
  ('AREA EXT 1'),
  ('AREA EXT 5'),
  ('AREA EXT 49'),
  ('AREA EXT 50');

select
    area_name,
    regexp_replace(area_name, ' EXT (\d*)', ' EXT ' || lpad('\1', 4, '0')) as order_result
from ext_test
order by order_result;

area_name    | order_result
------------------------------ 
AREA         | AREA
AREA EXT     | AREA EXT
AREA EXT 1   | AREA EXT 001
AREA EXT 49  | AREA EXT 0049
AREA EXT 5   | AREA EXT 005
AREA EXT 50  | AREA EXT 0050

替换表达式哪里出错了?

推荐答案

我不确定您为什么要尝试将它们格式化您的问题要求订购.这很简单.只需将它们保留为 int.

<块引用>

我想对结果进行数字排序,如上所示.

只需放入 ORDER BY 语句即可.

SELECT area_name
FROM ext_test
ORDER BY
  CASE
    WHEN area_name ~ '\d'
    THEN (regexp_matches(area_name, '\d+'))[1]::int
  END NULLS FIRST,
  area_name;

  area_name  
-------------
 AREA
 AREA EXT
 AREA EXT 1
 AREA EXT 5
 AREA EXT 49
 AREA EXT 50
(6 rows)

本文地址:https://www.itbaoku.cn/post/1764117.html