2016-01-06 33 views
4

我需要一些MYSQL查询正则表达式的帮助来搜索包含具有精确模式的单元格的行。我是MYSQL正则表达式的新手。使用REGEXP进行MYSQL查询 - make-it非贪婪

这是命名为TEST_TABLE一个示例表(json_value是一个数组的JSON字符串)

|id | json_value                     
----------------------------------------------------------------------------------------------- 
| 1 | {"field_198":false,"field_4":"From quality office","field_9":"product with high quality","field_10":"comment"}  
| 2 | {"field_198":true,"field_4":"From ordering office","field_9":"back to quality office","field_10":"comment"} 
| 3 | {"field_198":true,"field_4":"From ordering office","field_9":"cancelled","field_10":"comment"}      
| 4 | {"field_198":true,"field_4":"Return to quality office","field_9":"product ok","field_10":"comment"} 

如果我想获得的所有行:

- field_4 containing "quality" string, the query should to return id 1 and 4 
- field_9 containing "quality" string, the query should to return id 1 and 2 
- field_4 containing "ordering" string, the query should to return id 2 and 3 

我希望的例子是concludent。

我曾尝试使用此查询

SELECT id from test_table WHERE json_value REGEXP 'field_4":".*quality.*'; 

但field_9第2行

另一个查询返回id为1,2和4,因为是贪婪,找到了“质量”(我知道,这是一个愚蠢的正则表达式)

SELECT id from test_table WHERE json_value REGEXP 'field_4":"[^quality]*quality.*'; 

但仅返回ID 1

我已经readed很多在互联网上的帖子,但没有成功。 正则表达式应该如何得到正确的行?

编辑 还有一认为,要更加明确,从搜索的第一部作品是从阵列中的全键,但第二部分的值,如“%字符串%”

谢谢

+1

如果你是在MySQL 5.7看看JSON_CONTAINS – Mihai

+0

我在Cpanel与Mysql 5.6.28 – vasilenicusor

回答

1

这是我能想出的最好:

SELECT id from test_table WHERE json_value REGEXP 'field_4":"[^"]*quality'; 

它符合你的要求给你提供的数据。这将打破,但是,如果你的JSON包含嵌入式/转义双引号,如:

+----+----------------------------------------------------------------------------------------------------------------+ 
| id | json_value                          | 
+----+----------------------------------------------------------------------------------------------------------------+ 
| 1 | {"field_198":false,"field_4":"From quality office","field_9":"product with high quality","field_10":"comment"} | 
| 2 | {"field_198":true,"field_4":"From ordering office","field_9":"back to quality office","field_10":"comment"} | 
| 3 | {"field_198":true,"field_4":"From ordering office","field_9":"cancelled","field_10":"comment"}     | 
| 4 | {"field_198":true,"field_4":"Return to quality office","field_9":"product ok","field_10":"comment"}   | 
| 5 | {"field_198":true,"field_4":"Return to \"quality\" office","field_9":"product ok","field_10":"comment"}  | 
+----+----------------------------------------------------------------------------------------------------------------+ 
5 rows in set (0.00 sec) 

mysql> SELECT id from test_table WHERE json_value REGEXP 'field_4":"[^"]*quality'; 
+----+ 
| id | 
+----+ 
| 1 | 
| 4 | 
+----+ 
2 rows in set (0.01 sec) 

在这种情况下,我认为你所想要的行与要返回id=5,但事实并非如此。但是如果你有这样的数据,我认为你别无选择,只能真正解析它,而正则表达式不会做到这一点。