【问题标题】:Mysql: get json array length and ignore null valuesMysql:获取json数组长度并忽略空值
【发布时间】:2021-07-16 14:56:07
【问题描述】:

我有这个问题

select json_length(data->"$.row.*.code") as count from hospitalization_history where id = 238

count中的结果是8,因为data->"$.row.*.code"返回["J00.00", "V01.00", "G00.00", null, null, null, null, null]

如何获取 json 数组中非空值的数量?

【问题讨论】:

  • 将您的数组解析为行集,然后计算非null 值。见dbfiddle.uk/…
  • @Akina 我将您的评论发布为社区 wiki。
  • @Scratte 我不确定我的代码是否适用于 OP 的服务器(它的版本可能太旧) - 在这种情况下,必须更改解决方案。
  • @Akina 我明白了。我没有想到这一点。如果他们回复说这对他们不起作用,或者您更愿意自己发布答案。我会删除它。我刚刚看到你的评论并玩弄它并自己学到了一些新东西:)
  • @Akina 似乎您的解决方案适用于 MySQL 8.0.24+。我有 8.0.16,结果得到 8

标签: mysql mysql-json


【解决方案1】:

来自Akinacomment

将您的数组解析为行集,然后计算非空值。见https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=dd0a37bb25d526f029a7a82c6a1fe0cc

小提琴中的SQL是:

WITH cte AS (SELECT '["J00.00", "V01.00", "G00.00", null, null, null, null, null]' jstr)
SELECT COUNT(val)
FROM cte
JOIN JSON_TABLE(cte.jstr,
                '$[*]' COLUMNS (val VARCHAR(255) PATH '$')) jtable

结果

COUNT(val)
3

【讨论】:

  • 我在 MySQL 8.0.16 上测试过,结果是 8
  • @AndriyLozynskiy 您可能想在对问题的评论中 ping Akina 并让他们知道。您应该使用您正在使用的版本更新您的问题。
【解决方案2】:

终于找到了适用于 MySQL 8+ 的解决方案:

SELECT JSON_LENGTH(
    JSON_SEARCH('["J00.00", "V01.00", "G00.00", null, null, null]','all','%')
) AS count;

Try it here

【讨论】:

    猜你喜欢
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 2022-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    相关资源
    最近更新 更多