【问题标题】:Search JSON_ARRAY using dynamic variable使用动态变量搜索 JSON_ARRAY
【发布时间】:2021-04-15 00:04:04
【问题描述】:

是否可以使用变量作为索引而不是硬编码值来搜索 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 中包含的内容进行搜索。

【问题讨论】:

标签: mysql sql json


【解决方案1】:

无法让 JSON_SEARCH 工作,但工作如下:

SELECT
t1.*,
JSON_EXTRACT(t1.tickets, CONCAT('$[', t1.arr_pos, ']')) AS winning_ticket
FROM
(
    SELECT
    c.id AS competition_id,
    JSON_ARRAYAGG(t.id) AS tickets,
    COUNT(t.id) AS tickets_sold,
    FLOOR(RAND()*(COUNT(t.id))) 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

【讨论】:

    【解决方案2】:

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

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-03
      • 1970-01-01
      • 2012-07-28
      • 2013-05-27
      • 1970-01-01
      • 2014-12-05
      • 2018-05-27
      • 1970-01-01
      相关资源
      最近更新 更多