Mysql 如何搜索内容但跳过方括号内的内容?

Mysql 如何搜索内容但跳过方括号内的内容?,mysql,sql,Mysql,Sql,我需要在post\u content表中找到所有带有双引号的帖子 SELECT * FROM `pl_posts` WHERE `post_content` LIKE '%"%' 这是一个WordPress网站,所以我得到几千行,因为每篇文章都包含短代码,最常见的是: [gallery columns="4" ids="22502,22504,22503"] 如何搜索post_内容表中的所有内容,但使其跳过方括号内的内容[…]?根据您的数据,可以为您的WHERE子句提供多种解决方案 选项1:

我需要在
post\u content
表中找到所有带有双引号的帖子

SELECT * FROM `pl_posts` WHERE `post_content` LIKE '%"%'
这是一个WordPress网站,所以我得到几千行,因为每篇文章都包含短代码,最常见的是:

[gallery columns="4" ids="22502,22504,22503"]

如何搜索
post_内容表中的所有内容,但使其跳过方括号内的内容
[…]

根据您的数据,可以为您的
WHERE
子句提供多种解决方案

选项1:只跳过内容包含方括号的记录

post_content LIKE '%"%' AND post_content NOT LIKE '%[%'
选项2:如果您有双引号和方括号内的混合字段内容,解决方案是在搜索双引号之前删除方括号内的任何内容

REGEXP_REPLACE(txt, '\\[[^\\]]*\\]', '') LIKE '%"%'
regexp的意思是:一个左括号,后跟不同于右括号的O到N个字符,然后是右括号

选项3:功能与选项2相同,但使用更复杂的正则表达式替换
REGEXP\u

REGEXP_LIKE(txt, '(^|\\])[^\\[\\]]*"')
对于较旧版本的MySQL(<8.0.4),可以这样写:

txt REGEXP '(^|[[.right-square-bracket.]])[^[.left-square-bracket.][.right-square-bracket.]]*"'
dbfiddle

txt | txt不象“%[%”| REGEXP|u REPLACE(txt,“\[^\]\]”,'')像“%”| txt,(^ 124;\])[^\[\]]”像REGEXP|u REPLACE(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
根据您的数据,您的
WHERE
子句可能有几种解决方案

选项1:只跳过内容包含方括号的记录

post_content LIKE '%"%' AND post_content NOT LIKE '%[%'
选项2:如果您有双引号和方括号内的混合字段内容,解决方案是在搜索双引号之前删除方括号内的任何内容

REGEXP_REPLACE(txt, '\\[[^\\]]*\\]', '') LIKE '%"%'
regexp的意思是:一个左括号,后跟不同于右括号的O到N个字符,然后是右括号

选项3:功能与选项2相同,但使用更复杂的正则表达式替换
REGEXP\u

REGEXP_LIKE(txt, '(^|\\])[^\\[\\]]*"')
对于较旧版本的MySQL(<8.0.4),可以这样写:

txt REGEXP '(^|[[.right-square-bracket.]])[^[.left-square-bracket.][.right-square-bracket.]]*"'
dbfiddle

txt | txt不象“%[%”| REGEXP|u REPLACE(txt,“\[^\]\]”,'')像“%”| txt,(^ 124;\])[^\[\]]”像REGEXP|u REPLACE(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

我不确定如何使用选项2,从其他地方搜索如何使用我尝试运行的REGEXP\u REPLACE:选择post\u内容,REGEXP\u REPLACE(post\u内容,\[[^\]*\]',“”)从wp_帖子-如果这是正确的,我得到函数REGEXP_REPLACE没有exist@IvanTopić,你使用的是哪个版本的mysql?@IvanTopić:如果你运行的是mysql<8.0.4,你需要更改语法:我更新了我的答案。这个表达式应该放在
WHERE
子句中,比如:
SELECT post_content FROM wp_posts WH在发布内容REGEXP'(^ 124;\\][^\\[\]]*“'之前
Hm现在我看到REGEXP\u REPLACE需要MySQL 8+。我在本地主机上执行此操作,Wampserver安装了MySQL 5.7.19。看看Wamp网站,这是他们在下载部分提到的版本,整个查询应该是:
SELECT post\u content FROM wp\u posts WHERE post\u content REGEXP'(^ |\\]])[^\\[\]]*“
就这样?我没有得到任何结果,但如果我在语法出现错误后放置LIKE部分:
从wp_posts中选择post_内容,其中post_内容REGEXP'(^ 124;\])[^\\[\]*“'像“%””%
我不确定如何使用选项2,从其他地方搜索如何使用我尝试运行的REGEXP_REPLACE:选择post_内容,REGEXP_REPLACE(post_内容),\[^\]]*\]如果这是正确的,我得到的函数REGEXP\u REPLACE不存在exist@IvanTopić,您正在使用哪个版本的mysql?@IvanTopić:如果您正在运行mysql<8.0.4,则需要更改语法:我更新了我的答案。这个表达式应该放在
WHERE
子句中,比如:
selectpost\u content FROM wp\u posts-WHERE-post\u content REGEXP'(^ 124;\\\])[^\\[\]]*“
Hm现在我看到REGEXP\u REPLACE需要MySQL 8+。我在本地主机上执行此操作,Wampserver安装了MySQL 5.7.19。看看Wamp网站,这是他们在下载部分提到的版本,整个查询应该是:
SELECT post\u content FROM wp\u posts WHERE post\u content RE RE