【问题标题】:Counting words in JSON array mySQL计算 JSON 数组 mySQL 中的单词
【发布时间】:2020-05-08 16:38:01
【问题描述】:

我需要计算 JSON 数据类型中的真假单词。 我在单元格中有这个 JSON:

{"1": true, "2": false, "3": true}

值的数量可能会有所不同。我意识到我可以计算数组中值的总数,但是如何分别计算真假? 对于总数,我使用了JSON_LENGTH()

【问题讨论】:

  • 你的数据库版本是多少?

标签: mysql sql json group-by count


【解决方案1】:

一个选项将使用以下方法,其中包含JSON_LENGTH()JSON_EXTRACT()JSON_SEARCH() 函数,即使对于版本5.7 (5.7.13+),其中一个数组(js) 在子查询中提取并且它们'通过使用包含all 作为第二个参数的JSON_SEARCH() 函数将每个值(truefalse)拆分为单独的数组,然后由JSON_LENGTH() 函数计数:

SELECT ID, 
       JSON_LENGTH( JSON_SEARCH(js, 'all', 'true') ) AS Cnt_True,
       JSON_LENGTH( JSON_SEARCH(js, 'all', 'false') ) AS Cnt_False
  FROM ( SELECT *, JSON_EXTRACT(jsdata, '$.*') AS js
           FROM tab ) t

提供的 JSON 字段具有引用值,例如 "true""false"

JSON_EXTRACT(jsdata, '$.*') 仍然可以在布尔值未引用的情况下使用,就像您的情况一样。但是,这一次将需要一些字符串操作。在这里,我更喜欢使用CHAR_LENGTH() 函数:

SELECT ID,  
       CHAR_LENGTH(js) - CHAR_LENGTH(REPLACE(js, 'true', SPACE(LENGTH('true')-1))) 
        AS Cnt_True,
       CHAR_LENGTH(js) - CHAR_LENGTH(REPLACE(js, 'false', SPACE(LENGTH('false')-1))) 
        AS Cnt_False        
  FROM
  ( SELECT *, JSON_EXTRACT(jsdata, '$.*') AS js
      FROM tab ) t

Demo

【讨论】:

  • 感谢您的回答。该数据库已经包含许多记录,其中没有对真假的引用。是否可以读取数组中的布尔值?我尝试使用JSON_QUOTE,但效果不佳...
  • 不客气@SerhiyOsmolenko。由于未引用的布尔值,我更新了答案。
【解决方案2】:

这是一个使用json_table() 的选项,在 MySQL 8.0 中可用。

您可以首先使用路径$.*' 将每个 json 对象转换为值数组。然后,您可以将生成的 json 数组传递给 json_table(),这会将每个值放在单独的行中。最后一步是条件聚合。

假设 json 列名为js,则为:

select sum(x.val = 'true') cnt_true, sum(x.val = 'false') cnt_false
from mytable t
cross join json_table(js -> '$.*', '$[*]' columns (val varchar(5) path '$')) x

Demo on DB Fiddle

示例数据(我添加了另一行以使其更有意义):

| js | | :--------------------------------- | | {“1”:真,“2”:假,“3”:真} | | {“酒吧”:假,“富”:真} |

结果:

cnt_true | cnt_false --------: | --------: 3 | 2

【讨论】:

  • 你统计列中所有的json数组,单元格中我需要。
  • @SerhiyOsmolenko:你的表的主键是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 2011-08-04
相关资源
最近更新 更多