关于mysql的SQL regexp查询

时间:2018-01-05 14:06:05

标签: mysql sql regex

我有一个名为 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)动态的,我可以根据查询随时更改它。

提前感谢。

2 个答案:

答案 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