我需要在"
表中找到所有带有双引号post_content
的帖子
SELECT * FROM `pl_posts` WHERE `post_content` LIKE '%"%'
这是一个WordPress网站,因此我得到几千行,因为每个帖子都包含短代码,最常见的是以下代码:
[gallery columns="4" ids="22502,22504,22503"]
我如何搜索post_content
表中的所有内容,但跳过了方括号[...]
中的内容?
答案 0 :(得分:3)
WHERE
子句可能有几种解决方案,具体取决于您的数据。
选项1:仅跳过内容包含方括号的记录
post_content LIKE '%"%' AND post_content NOT LIKE '%[%'
选项2:如果您将带有双引号oustide AND的字段混合在一起并且在方括号内,则解决方案是在对双引号进行定位之前删除方括号内的所有内容
REGEXP_REPLACE(txt, '\\[[^\\]]*\\]', '') LIKE '%"%'
正则表达式的意思是:一个左括号,后跟一个不同于右括号的O到N个字符,然后是一个右括号。
选项3:在功能上与选项2相同,但是使用REGEXP_REPLACE
和更复杂的正则表达式:
REGEXP_LIKE(txt, '(^|\\])[^\\[\\]]*"')
对于旧版本的MySQL(<8.0.4),可以这样写:
txt REGEXP '(^|[[.right-square-bracket.]])[^[.left-square-bracket.][.right-square-bracket.]]*"'
db <>提琴here
WITH tests as (
SELECT '[columns="4"]' txt
UNION SELECT 'abc"db'
UNION SELECT 'abc"db[columns="4"]'
UNION SELECT '[columns="4"]abc"db'
UNION SELECT '[columns="4"]abc"db[columns="4"]'
)
SELECT
txt,
txt NOT LIKE '%[%',
REGEXP_REPLACE(txt, '\\[[^\\]]*\\]', '') LIKE '%"%',
REGEXP_LIKE(txt, '(^|\\])[^\\[\\]]*"')
FROM tests
txt | txt NOT LIKE '%[%' | REGEXP_REPLACE(txt, '\[[^\]]\]', '') LIKE '%"%' | REGEXP_LIKE(txt, '(^|\])[^\[\]]"') :------------------------------- | -----------------: | --------------------------------------------------: | -------------------------------------: [columns="4"] | 0 | 0 | 0 abc"db | 1 | 1 | 1 abc"db[columns="4"] | 0 | 1 | 1 [columns="4"]abc"db | 0 | 1 | 1 [columns="4"]abc"db[columns="4"] | 0 | 1 | 1