我有一个名为 customer 的表,有一个名为 custom_id 的字段,其中包含相关数据。
{"18":["45","48","91"],"20":["82","83",84],"21":["30","31"]}
现在我想查询此字段中"20":["82","83","84"]
的客户。
"20"
:这部分是我想要的,相关部分是我的条件(82,83,84)
结果将显示是否有任何客户"82" or "83" or "84" after "20"
:
如何使用regexp从此字段查询这些条件。
这是一个例子:
SELECT * FROM `customer` WHERE `custom_id` REGEXP '"20":["82","83","84"]'
你可以看到我添加[]系统不会像字符串那样接受它,而且这些字段也是(82, 83, 84)
动态的,我可以根据查询随时更改它。
提前感谢。
答案 0 :(得分:2)
正如Tim Biegeleisen所说,如果可以的话,你应该在这里使用MySQL的JSON支持。一种方法是:
SELECT *
FROM customer
WHERE JSON_CONTAINS(custom_id, '"82"', '$."20"')
OR JSON_CONTAINS(custom_id, '"83"', '$."20"')
OR JSON_CONTAINS(custom_id, '"84"', '$."20"');
但是,如果你的MySQL版本不支持JSON,你可以像这样使用REGEXP
:
SELECT *
FROM customer
WHERE custom_id REGEXP '"20": ?\\[[^]]*[[:<:]]82[[:>:]]'
OR custom_id REGEXP '"20": ?\\[[^]]*[[:<:]]83[[:>:]]'
OR custom_id REGEXP '"20": ?\\[[^]]*[[:<:]]84[[:>:]]';
此正则表达式将按任意顺序匹配数字。它分解如下:
"20": ? - literal "20": optionally followed by a single space
\\[ - opening [
[^]]* - zero or more of anything other than a closing ]
[[:<:]] - opening word boundary (make sure we match entire number)
82 - number to match
[[:>:]] - closing word boundary
答案 1 :(得分:0)
我尝试了以下内容:
SELECT * FROM customer where custom_id regexp '[."20":["82","83","84"].]';
然后又回来了:
"20":["82","83","84"]
检查此解决方案的链接:http://sqlfiddle.com/#!9/d10fd6/3