oracle 是否可以删除前面的新行,只保留最后一行?

rwqw0loc  于 2023-08-04  发布在  Oracle
关注(0)|答案(2)|浏览(99)

我正在解决这个问题,但我不能使它工作。看到下面的代码,有人能给予我修改有关查询?
我希望这个插入语句从这个

`Insert into Sample_Table
   (DESCRIPTION)
 Values
   ('This is example
test
TEST');`

字符串
当我查看表中该数据的insert语句时:

`Insert into Sample_Table
   (DESCRIPTION)
 Values
   ('This is example test
TEST');`


可以使用正则表达式吗?
这是我正在使用的查询。有人能修改一下吗?这样我就能得到预期的输出了。先谢谢你。

`DECLARE

CURSOR chk_for_bad_data IS
   SELECT description
     FROM Sample_Table 
    WHERE REGEXP_LIKE (replace(replace(description,chr(10), ';'), CHR(09), ';'), '[^[:print:]]', 'x');

BEGIN

   FOR get_bad_data IN chk_for_bad_data LOOP

       UPDATE Sample_Table 
       SET description = regexp_replace(description, '(.*)(\r?\n)+$', '\1\r\n');
       WHERE descriptio = get_bad_data.description
   END LOOP;     
END;`

qeeaahzv

qeeaahzv1#

首先,您可以将描述分为两部分:
1.直到最后一行:

SUBSTR(description,1,INSTR(description,CHR(10),-1))

1.从最后一行开始:

SUBSTR(description,INSTR(description,CHR(10),-1))

然后,删除第一部分中的所有换行符:

REPLACE(SUBSTR(description,1,INSTR(description,CHR(10),-1)),CHR(10),'')

最后将结果字符串和初始第二部分连接起来:

**REPLACE(SUBSTR(description,1,INSTR(description,CHR(10),-1)),CHR(10),'')||

SUBSTR(description,INSTR(description,CHR(10),-1))**
当然,这仅适用于描述中至少有一个换行符的元素。
举例来说:

UPDATE Sample_Table
   SET description = REPLACE(SUBSTR(description, 1, INSTR(description, CHR(10), -1)), CHR(10), '') || SUBSTR(description, INSTR(description, CHR(10), -1))
 WHERE INSTR(description, CHR(10)) > 0;

字符串
您的代码还对'tab'和'return'字符执行了一些操作。问题中没有具体说明,所以我不知道该怎么办。
也许你想在删除换行符的地方插入一个空格。在这种情况下,将REPLACE函数的最后一个参数从空字符串更改为单个空格。

ymzxtsji

ymzxtsji2#

您不需要正则表达式,可以使用简单的字符串函数来查找最后一个换行符的索引,然后替换子字符串中在此之前的所有换行符:

WITH data (value) AS (
  SELECT 'This is example
test
TEST' FROM DUAL
)
SELECT CASE
       WHEN INSTR(value, CHR(10), -1) = 0
       THEN value
       ELSE REPLACE(SUBSTR(value, 1, INSTR(value, CHR(10), -1) - 1), CHR(10), ' ')
            || SUBSTR(value, INSTR(value, CHR(10), -1))
       END AS removed
FROM   data

字符串
哪些输出:
| REMOVED |
| ------------ |
| 测试TEST |
然后,您的查询可以简化为(不需要任何游标或循环):

UPDATE sample_table
SET description = CASE
                  WHEN INSTR(description, CHR(10), -1) = 0
                  THEN description
                  ELSE REPLACE(SUBSTR(description, 1, INSTR(description, CHR(10), -1) - 1), CHR(10), ' ')
                       || SUBSTR(description, INSTR(description, CHR(10), -1))
                  END
WHERE  REGEXP_LIKE(description, '[^[:print:]]');


fiddle

相关问题