SQL查询以打印部分字符串值

时间:2019-04-23 10:42:24

标签: mysql sql

我在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

3 个答案:

答案 0 :(得分:4)

不要使用正则表达式解析JSON,而使用JSON_EXTRACT函数:

SELECT JSON_EXTRACT(json, "$.clients")
FROM yourTable;

Demo

除非没有其他选择,否则使用正则表达式解析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。 其他所有东西都会变成大拐杖。