SQL:Regexp_replace 但仅在值第一次出现在记录中时

Posted

技术标签:

【中文标题】SQL:Regexp_replace 但仅在值第一次出现在记录中时【英文标题】:SQL: Regexp_replace but only the first time a value appears in record 【发布时间】:2021-10-31 14:21:48 【问题描述】:

我在留言栏有帖子内容。

我想用 X 搜索和替换模式,但只有第一次模式出现在记录中,因为它可能出现多次。

下面的查询显然会用 X 替换所有模式实例

UPDATE xf_post SET message = REGEXP_REPLACE (message, 'pattern', 'X');

在 oracle db 上使用此命令非常简单。

UPDATE xf_post SET message = REGEXP_REPLACE (message , 'pattern', 'X', 1, 1);

但是服务器有 mariadb ????我不知道该怎么做。

【问题讨论】:

在 MariaDB 中没有额外的参数可以设置替换的数量,所有出现的地方都会被替换。当替换模式包含对找到的模式组的引用时,没有简单的方法可以模拟这一点。如果替换是文字,则使用 REGEXP_INSTR() 查找模式,定义其位置和长度,然后将其剥离并使用两个 SUBSTRING() 替换。 【参考方案1】:

一个 REGEXP_REPLACE 模拟示例,仅具有第一次出现替换。

SELECT txt,
       CONCAT(LEFT(txt, LOCATE(REGEXP_SUBSTR(txt,'pattern'), txt) - 1),
              REGEXP_REPLACE(REGEXP_SUBSTR(txt,'pattern'), 'pattern', 'replacement'),
              SUBSTRING(txt FROM LOCATE(REGEXP_SUBSTR(txt,'pattern'), txt) + LENGTH(REGEXP_SUBSTR(txt,'pattern')))) output
FROM test

fiddle with the explanations

【讨论】:

以上是关于SQL:Regexp_replace 但仅在值第一次出现在记录中时的主要内容,如果未能解决你的问题,请参考以下文章

SQL仅在值与所有先前值不同时获取行号

MS SQL Server 在空格上拆分单词,但仅在不在双引号中时

GetRequestStream() 返回 WebException 超时...但仅在某些机器上

运行时错误,但仅在第二个循环中

合并 - 仅在值更改时更新

Redshift 在多个条件下加入,但仅在一个条件不匹配时返回