首页 > 解决方案 > 使用动态变量搜索 JSON_ARRAY

问题描述

是否可以使用变量作为索引而不是硬编码值来搜索 JSON_ARRAY?

这就是我的意思:

SELECT
t1.*,
t1.tickets->>"$[t1.arr_pos]"
FROM
(
    SELECT
    c.id AS competition_id,
    JSON_ARRAYAGG(t.id) AS tickets,
    COUNT(t.id) AS tickets_sold,
    FLOOR(RAND()*(COUNT(t.id)-0+1)) AS arr_pos
    FROM competitions c
    JOIN tickets t ON t.competition_id = c.id
    WHERE c.end_date = '2021-01-15 15:00:00'
    AND c.tickets_sold > 0
    GROUP BY c.id
) t1

如果我将 t1.arr_pos 更改为一个数字(0、1、2 等),它显然可以工作,但我需要根据 arr_pos 中包含的内容进行搜索。

标签: mysqlsqljson

解决方案


您可以使用JSON_SEARCH()函数来确定数组中第一次出现的搜索表达式的索引(在这种情况下,选择一个 id 值数组)以及one作为第二个参数,然后按此值提取以获得所需的结果。

SELECT t1.*, 
       JSON_EXTRACT(t1.tickets,
                    JSON_UNQUOTE(JSON_SEARCH(t1.tickets, 'one', "123")) 
                 -- example id value is 123
       ) AS Result,
       JSON_UNQUOTE(JSON_SEARCH(tickets, 'one', "123")) AS Related_Index
  FROM
  (
   <your subquery>
  )

Demo


推荐阅读