mysql - 基于通配符替换字符串的 SQL 查询
问题描述
我想在我的 WP 数据库上运行这种类型的查询以删除所有 id="more-" 的跨度实例:
UPDATE wp_posts SET post_content = REPLACE (
post_content,
'<p><span id="more-35075"></span></p>',
'');
但是在我的示例中,“more-”后面的数字是一个变量。如何用通配符之类的东西编写这个查询:span id="more-*.
谢谢
解决方案
在 MySQL 8.0 及以上版本中,可以使用REGEX_REPLACE()
函数。在没有相同的情况下,可以进行一些复杂的字符串操作。这是基于您的确认,即所述子字符串在一个值中仅出现一次。
REPLACE()
不支持通配符、模式、正则表达式等。它只会用更大的字符串中的另一个固定子字符串替换给定的固定子字符串。
相反,我们可以尝试提取post_content
. 我们将在'<p><span id="more-'
usingSubstring_Index()
函数之前提取前导子字符串。同样,我们将在该'"></span></p>'
部分之后提取尾随子字符串。
现在,我们可以简单地通过Concat()
这些部分来获得所需的post_content
. 您可以在此处找到使用的各种字符串函数的详细信息:https ://dev.mysql.com/doc/refman/8.0/en/string-functions.html
我还添加了一个WHERE
条件,以便我们只选择那些与给定子字符串条件匹配的行。
UPDATE wp_posts
SET post_content =
CONCAT(
SUBSTRING_INDEX(post_content,
'<p><span id="more-',
1),
SUBSTRING(post_content,
LOCATE('"></span></p>',
post_content,
LOCATE('<p><span id="more-',
post_content)
) + 13) -- 13 is character length of "></span></p>
)
WHERE post_content LIKE '%<p><span id="more-%"></span></p>%';
查询 #1:更新操作之前的数据
SELECT * FROM wp_posts;
| post_content |
| ------------------------------------------------------- |
| adasdaadsa<p><span id="more-35075"></span></p>121324124 |
| 1412123123<p><span id="more-232"></span></p>adasdaafas |
查询 #2:更新操作后的数据
SELECT * FROM wp_posts;
| post_content |
| -------------------- |
| adasdaadsa121324124 |
| 1412123123adasdaafas |
推荐阅读
- java - 我如何阻止球离开屏幕?
- lightningchart - 以编程方式拖动 Lightningchart 的图表
- android - 如何使 AppCompatActivity 活动可滑动并包含应用栏?
- excel - VBA .PasteSpecial 正在读取但未在模块中的函数中执行
- json - 如何使用 Powershell 解析 json 文件以获取每个值?
- snowflake-cloud-data-platform - 雪花 - 未嵌套列出现错误:无效参数 > 函数类型
- playframework - 如何将 url 数组查询参数传递到 Play Framework?
- class - 这是在 Kotlin 中继承超类的正确语法吗?
- node.js - 将所有 firebase 用户列为承诺的代码审查
- r - stats::mad 疯了吗?