【问题标题】:MYSQL REGEXP search in JSON stringMYSQL REGEXP 在 JSON 字符串中搜索
【发布时间】:2011-09-23 12:24:14
【问题描述】:

我是 regexp 的初学者,我尝试搜索 json 格式的文本,但我无法正常工作:

SELECT DISTINCT tag, body FROM pages 
WHERE (body REGEXP BINARY '"listeListeOuiNon":".*1.*"')

它显示我作为结果文本与

"listeListeOuiNon":"1" 和

"listeListeOuiNon":"1,2" 和

"listeListeOuiNon":"0,1"as expected,

还有"listeListeOuiNon":"2" (not expected)

有什么想法吗? 也许是因为它很贪心,但我不确定......

提前致谢!

【问题讨论】:

  • 请注意,MySQL REGEX 是一个非常昂贵的操作。如果可以摆动它,通常可以更快地将其分解为多个 LIKE 语句。另外,这是一个常见的查询还是匹配的文本会经常变化?
  • 是的,我知道喜欢更快,但实际上匹配文本正在改变并尝试使用 LIKE '"listeListeOuiNon":"%1%"' 并没有更好..
  • 你能给我们一个匹配“listeListeOuiNon”:“2”的示例行吗?
  • 是的,例如:SELECT '"listeListeOuiNon":"2", "listeToto":"1"' REGEXP BINARY '"listeListeOuiNon":".*1.*"'

标签: mysql regex json


【解决方案1】:

嗯,调试起来很容易:

SELECT '"listeListeOuiNon":"2"' REGEXP BINARY '"listeListeOuiNon":".*1.*"'

返回 0

SELECT '"listeListeOuiNon":"1"' REGEXP BINARY '"listeListeOuiNon":".*1.*"'

返回 1

SELECT '"listeListeOuiNon":"1,2"' REGEXP BINARY '"listeListeOuiNon":".*1.*"'

返回 1

所以有些东西不适合您...因为它无法返回正文等于"listeListeOuiNon":"2" 的行。但有可能,该正文有几个这样的语句,例如:

body => '"listeListeOuiNon":"1,2", "listeListeOuiNon":"2"'

所以你必须修改你的正则表达式:

'^"listeListeOuiNon":".*1.*"$'

那么,你必须修改你的查询:

SELECT DISTINCT tag, body FROM pages WHERE (body REGEXP BINARY '"listeListeOuiNon":".*1.*"') AND NOT (body REGEXP BINARY '"listeListeOuiNon":"2"')

【讨论】:

  • 感谢 Jauzsika,但实际上我有复杂的数据,例如:{"bf_titre":"Veille partage","listeListeLogiciel":"BAZ","listeListeEtatDuBug":"CONF","listeListeBugs" :"USER","listeListeOuiNon":"2","bf_sauveur":"Florian","id_typeannonce":"31","createur":"Anonyme","categorie_fiche":"维护站点","date_creation_fiche" :"2011-08-30 14:20:09","date_debut_validite_fiche":"2011-08-30","date_fin_validite_fiche":"0000-00-00","statut_fiche":"1","id_fiche": "VeillePartagee"}
【解决方案2】:

我会尝试用[^"]* 替换两个.*...但是,只有当您的listeListeOuiNon 不能包含乱七八糟的"s 时,这才足够,或者您还必须处理转义顺序。基本上使用.,您将匹配任何具有1“之后”"listListOuiNon":" 的 JSON 字符串,即使它在另一个字段中,是的,那是因为它是贪婪的。

【讨论】:

  • 哇!它似乎工作! SELECT '"listeListeOuiNon":"2", "listeToto":"1"' REGEXP BINARY '"listeListeOuiNon":"[^"]*1[^"]*"' 等于 0!谢谢美人!
【解决方案3】:

返回 0。

【讨论】:

  • 我的问题是我的 json 文本中有更多内容.. : SELECT '"listeListeOuiNon":"2", "listeToto":"1"' REGEXP BINARY '"listeListeOuiNon":".* 1.*"'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-12
  • 2016-07-19
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 2019-05-06
相关资源
最近更新 更多