你可以使用:
SELECT value AS original,
LTRIM(
REGEXP_REPLACE(
value,
'^((\d+)/(\d+)/(\d+)/)?(\d+)/(\d+)/(\d+)$',
'\2 \3 \4 \5\6\7'
)
) AS formatted
FROM table_name;
所以对于你的测试数据:
CREATE TABLE table_name ( value ) AS
SELECT '30/60/90/120/150/180' FROM DUAL UNION ALL
SELECT '150/180/210' FROM DUAL;
这个输出:
原创 |格式化
:-------------------- | :-----------------
30/60/90/120/150/180 | 30 60 90 120150180
150/180/210 | 150180210
db小提琴here
更新:
如果我正确理解了您更新的要求,您在斜线分隔的列表中有 1 到 3 位数字,并且您希望输出不带斜线的列表,因此每个数字都用空格右填充,所以它总是填充 3 个字符。
您可以找到每个 1-3 位数字并在其后附加两个空格,然后找到非斜杠字符并保留每组中的前 3 个字符(丢弃任何额外的数字和尾部斜杠):
SELECT value AS original,
REGEXP_REPLACE(
REGEXP_REPLACE(
value,
'(\d{1,3})(/|$)',
'\1 /'
),
'([^/]{3})[^/]{0,2}/',
'\1'
) AS formatted
FROM table_name;
对于样本数据:
CREATE TABLE table_name ( value ) AS
SELECT '30/60/90/120/150/180' FROM DUAL UNION ALL
SELECT '150/180/210' FROM DUAL UNION ALL
SELECT '90/120/150' FROM DUAL UNION ALL
SELECT '30/60/90' FROM DUAL UNION ALL
SELECT '30/60/90/120' FROM DUAL UNION ALL
SELECT '1/10/100/2' FROM DUAL;
输出:
原创 |格式化
:-------------------- | :-----------------
30/60/90/120/150/180 | 30 60 90 120150180
150/180/210 | 150180210
90/120/150 | 90 120150
30/60/90 | 30 60 90
30/60/90/120 | 30 60 90 120
1/10/100/2 | 1 10 1002
db小提琴here