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

问题描述 投票:0回答:1

所以在国家列中有两个数据,在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 arrays json mysql-workbench
1个回答
0
投票

您可以使用

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

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

样本数据的输出:

id  latest_passport
1   JP

dbfiddle.uk

上进行演示
© www.soinside.com 2019 - 2024. All rights reserved.