JSON只提取数组中的第一个元素,无论我在查询中的过滤器是什么

JSON extract only first element in array no matter what my filter in query is

提问人:imnfrhn 提问时间:9/13/2023 最后编辑:Drewimnfrhn 更新时间:9/23/2023 访问量:37

问:

所以在列国家有两个数据,在 json [“AX”、“JP”] 中,我想显示国家/地区“JP”,因为我的查询说 DESC。但是结果显示是“AX”,这是错误的,因为它应该显示“JP”。这是因为在我的查询中我放置了 $[0],所以无论我在查询中的过滤器是什么,它都会始终显示这个 json [“AX”, “JP”] 中的第一个元素,其中 'AX' 在数组中为 0。那么我应该如何修复这个美元部分$[0],以便我可以过滤我的数据。

这是护照列的数据,里面是护照列的国家数据

[{"status": 1, "country": "AX", "issued_date": "2022-07-05", "passport_no": "ABS123433NEW3", "expiration_date": "2000-06-07"}, {"status": 1, "country": "JP", "issued_date": "2022-05-01", "passport_no": "TK84773812NEW3", "expiration_date": "-"}]

这是查询

LEFT JOIN (
      SELECT
      employees.id AS emp_id,
      JSON_UNQUOTE(JSON_EXTRACT(employees.passport, '$[0].country')) AS latest_passport_no
    FROM
      TAL.employees
    WHERE
      JSON_UNQUOTE(JSON_EXTRACT(employees.passport, '$[0].country')) IS NOT NULL
    ORDER BY
      JSON_UNQUOTE(JSON_EXTRACT(employees.passport, '$[0].country')) DESC
  ) AS latest_passports ON EMP.id = latest_passports.emp_id
sql mysql 数组 json json-table

评论

0赞 Nick 9/13/2023
您使用的是哪个版本的 MySQL?
0赞 imnfrhn 9/13/2023
mysql Ver 8.0.34 for Win64 on x86_64 (MySQL Community Server - GPL)
0赞 Nick 9/13/2023
你能给出一个完整的数据样本吗?employees.passport
0赞 imnfrhn 9/13/2023
好的,我已经添加了它

答:

0赞 Nick 9/13/2023 #1

您可以使用 JSON_TABLE 从数据中提取所有值。然后可以对它们进行降序排序,并返回“最新”值:countryemployee.passport

SELECT e.id, MAX(jt.country) AS latest_passport
FROM employees e
JOIN JSON_TABLE(e.passport,
  '$[*]' COLUMNS(
    country VARCHAR(2) PATH '$.country'
  )
) AS jt
GROUP BY e.id

示例数据的输出:

id  latest_passport
1   JP

dbfiddle.uk 上的演示

评论

0赞 Nick 10/16/2023
@imnfrhn我想知道你为什么选择不接受这个答案?有没有一种情况不起作用?如果是这样,如果您使用该案例更新您的问题,我相信可以修改答案以解决问题。