在每个第n个字符后面加逗号,但它不应该在一个单词中

时间:2018-06-04 10:04:12

标签: sql oracle

我有一个很长的字符串,我必须在每300个字符后加上逗号。

我正在使用它并且工作正常:

select regexp_replace(column_name,'(.{300})','\1,') from table_name ;

但条件是我们不能在一个单词中加任何逗号。所以我们要检查第300个字符是否是空格,然后放一个逗号,否则找到前一个空格并在那里放逗号。

类似的情况:(我需要10而不是300)

运行查询后

select regexp_replace(column_name,'(.{10})','\1,') from table_name ;

示例输入:(即column_name的值):

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras viverra consectetur magna, vel vulputate sapien convallis ut.

示例输出:

Lorem ipsu,m dolor si,t amet, co,nsectetur ,adipiscing, elit. Cra,s viverra ,consectetu,r magna, ,vel ,vulputate sapien ,convallis ,ut.

但这是出乎意料的。

输出应该是这样的:

Lorem ,ipsum dolor ,sit amet, ,consectetur ,adipiscing, elit. ,Cras viverra ,,consectetur magna,, vel ,vulputate sapien ,convallis ,ut.

有人可以帮我吗?

2 个答案:

答案 0 :(得分:3)

我使用了|而不是逗号,因为您提供的示例数据使用了逗号:

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE table_name( data ) AS
SELECT 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras viverra consectetur magna, vel vulputate sapien convallis ut.' FROM DUAL;

查询1

WITH words ( id, data, word, wordno, numwords, len, grpstart, grp ) AS (
  SELECT ROWNUM,
         data, 
         REGEXP_SUBSTR( data, '^\S+', 1, 1 ),
         1,
         REGEXP_COUNT( data, '(^|\s)\S+' ),
         LENGTH( REGEXP_SUBSTR( data, '^\S+', 1, 1 ) ),
         0,
         0
  FROM   table_name
UNION ALL
  SELECT id,
         data, 
         REGEXP_SUBSTR( data, '\s\S+', 1, wordno + 1 ),
         wordno + 1,
         numwords,
         len + LENGTH( REGEXP_SUBSTR( data, '\s\S+', 1, wordno + 1 ) ),
         CASE
         WHEN len + LENGTH( REGEXP_SUBSTR( data, '\s\S+', 1, wordno + 1 ) )
              > grpstart + 10
         THEN len
         ELSE grpstart
         END,
         CASE
         WHEN len + LENGTH( REGEXP_SUBSTR( data, '\s\S+', 1, wordno + 1 ) )
              > grpstart + 10
         THEN grp+1
         ELSE grp
         END
  FROM   words
  WHERE  wordno < numwords
)
SELECT LISTAGG( words, '|' ) WITHIN GROUP ( ORDER BY grp )
         AS sentence
FROM   (
  SELECT id,
         grp,
         LISTAGG( word, '' ) WITHIN GROUP ( ORDER BY len ) AS words
  FROM   words
  GROUP BY id, grp
)
GROUP BY id

<强> Results

|                                                                                                                            SENTENCE |
|-------------------------------------------------------------------------------------------------------------------------------------|
| Lorem| dolor sit| amet,| consectetur| adipiscing| elit.| Cras| viverra| consectetur| magna,| vel| vulputate| sapien| convallis| ut. |

答案 1 :(得分:0)

您可以尝试在正则表达式中添加类似[^ a-z]的内容,以排除a-z中的所有字符。