【发布时间】:2019-06-10 09:59:25
【问题描述】:
我在 mysql 表列中有某种缓存列。让我们称之为cacheCol 它的结构为json。
cacheCol 示例
{
"23": {
"variationOption": "23",
"productCode": "322992-015",
"price": "150",
"qnt": ""
},
"25": {
"variationOption": "25",
"productCode": "322992-015",
"price": "150",
"qnt": "0"
},
"26": {
"variationOption": "26",
"productCode": "322992-015",
"price": "150",
"qnt": "7"
}
}
如果特定的 json 部分 qnt > 0,我想选择 myslq 行。在此示例中,键为 26 的部分只有一个匹配。
我已经制定了正则表达式来检查这些值: https://www.regextester.com/?fam=109762
但是当我运行我的查询时
SELECT * FROM "tbl" WHERE ("cacheCol" REGEXP ('(?<=\"26":\{)[^\{]*"qnt":"[1-9]\d*"(?=.*\})'))
出现错误:
Got error 'repetition-operator operand invalid' from regexp
这里有 sqlfiddle 可以玩:http://www.sqlfiddle.com/#!9/30335a/1 (更新 sqlfiddle 以涵盖 DB 中的更多变体)
有什么方法可以解决我的正则表达式以与 mysql 兼容。
找到一些关于具有 json 数据类型的 mysql 5.7 的信息,也许在哪里可以避免使用正则表达式来获得我想要的结果?
【问题讨论】:
-
是的,我认为将数据类型(或转换)转换为 JSON 并使用 JSON search functions 是可行的方法。示例
SELECT * FROM tbl WHERE JSON_SEARCH( JSON_EXTRACT( CAST( cacheCol AS JSON ), "$**.qnt" ), 'all', '7' ) IS NOT NULL搜索qnt为 7 的所有行。