【问题标题】:Oracle SQL to format fieldOracle SQL 格式化字段
【发布时间】:2020-02-05 21:39:09
【问题描述】:

我正在寻找一个 Oracle sql 来将付款条件字段格式化为特定格式,如下所示:

Original
30/60/90/120/150/180
Formated
30 60 90 120150180

Original
150/180/210
Formated
150180210

我唯一想到的是 replace(pgto, '/', ' ') 结果是 30 60 90 12 150 180 我正在考虑 regexp_replace 但我不熟悉。

编辑:原始支付条件最多可以有12个位置,用“/”隔开,每个位置可以有1到3位数字。

【问题讨论】:

  • 为什么/在第一个示例中被替换为空白,而在第二个示例中没有?
  • 因为它有3个数字,所以如果1或2,它应该用空白替换其他位置。

标签: sql oracle formatting


【解决方案1】:

你可以使用:

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

【讨论】:

  • 谢谢@MT0 它几乎可以工作,但是还有更多条件,我应该把它们都列出来吗? 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;ORIGINAL FORMATTED 30/60/90/120/150/180 30 60 90 120150180 150/180/210 150180210 90/120/150 90120150 30/60/90 306090 30/60/90/120 30/60/90/120
  • @kelsen 请edit 提出您的问题,而不是将代码/输出发布到 cmets。我可以弄清楚代码的含义,但是由于注释没有对输出施加格式,因此您要表达的观点非常混乱。
  • 对不起@MT0 我不习惯发问题。我已经用更多的规范和图像作为示例编辑了这个问题。
  • @kelsen 已更新。如果这不是您想要的,那么您需要使用问题的详细说明来编辑问题,以便我们了解您想要实现的目标。
猜你喜欢
  • 2013-03-24
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 2019-06-18
相关资源
最近更新 更多