我在MySQL 5.6表中有一个文本字段,其中包含JSON的字符串表示形式。 此类JSON存在具有ID数组的字段“客户端”,例如:
{
...
"clients":[1,2,3],
...
}
如何编写SQL查询,以便为每条记录准确地从JSON打印这部分文本,例如:
clients
-----------------
"clients":[1,2,3]
"clients":[4,5]
...
我应该使用某种正则表达式还是可以更轻松地完成它?
谢谢!
更新:JSON_EXTRACT不适用于MySQL 5.6
答案 0 :(得分:4)
不要使用正则表达式解析JSON,而使用JSON_EXTRACT
函数:
SELECT JSON_EXTRACT(json, "$.clients")
FROM yourTable;
除非没有其他选择,否则使用正则表达式解析JSON通常不是一个好主意。在这种情况下,较新版本的MySQL提供了可以满足您要求的JSON API。
答案 1 :(得分:1)
我强烈建议您升级,此查询更有趣。
查询
SELECT
DISTINCT
SUBSTRING_INDEX(
SUBSTRING_INDEX(
records.cvs
, ','
, number_generator.number
)
, ','
, -1
) array_part
FROM (
SELECT
@row := @row + 1 AS number
FROM (
SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) row1
CROSS JOIN (
SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) row2
CROSS JOIN (
SELECT @row := 0
) init_user_params
) AS number_generator
CROSS JOIN (
SELECT
# parse out the 1,2,3 part from [1,2,3] part
SUBSTRING (
# parse out the [1,2,3] part
SUBSTRING(
records.json
, (LOCATE(':', records.json) + 1)
)
, 2
, LENGTH(
# parse out the [1,2,3] part
SUBSTRING(
records.json
, (LOCATE(':', records.json) + 1)
)
) - 2
) AS cvs
FROM (
SELECT
'"clients":[1,2,3]' AS json
) AS records
) AS records
结果
| array_part |
| ---------- |
| 1 |
| 2 |
| 3 |
请参阅demo
答案 2 :(得分:1)
必须通过SQL处理吗?我认为在SQL Server外部进行处理更为合理。 或者,您可以将MySQL升级到5.7.8+并使用JSON_EXTRACT。 其他所有东西都会变成大拐杖。