簡體   English   中英

使用動態變量搜索 JSON_ARRAY

[英]Search JSON_ARRAY using dynamic variable

是否可以使用變量作為索引而不是硬編碼值來搜索 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 中包含的內容進行搜索。

您可以使用JSON_SEARCH() function 來確定數組中第一次出現的搜索表達式的索引(在這種情況下,選擇一個 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>
  )

演示

無法讓 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM