我面臨以下問題:我有一個這樣的 JSON 陣列:
[{"from":"09:25","to":"14:00"},{"from":"15:05","to":"16:10"},{"from":"17:40","to":"17:50"},{"from":"19:00","to":"19:10"},{"from":"19:30","to":"19:50"}]
我想要一個 MySQL 查詢,它為每個間隔回傳一行,包含“從”和“到”作為列。到目前為止,我已經嘗試過這個:
SELECT
idx,
REPLACE(JSON_EXTRACT(JSON_EXTRACT(json, CONCAT('$[', idx, ']')), CONCAT('$.from')), '"', '') AS 'from',
REPLACE(JSON_EXTRACT(JSON_EXTRACT(json, CONCAT('$[', idx, ']')), CONCAT('$.to')), '"', '') AS 'to',
json
FROM test.json
JOIN (
SELECT 0 AS idx UNION
SELECT 1 AS idx UNION
SELECT 2 AS idx UNION
SELECT 3 AS idx UNION
SELECT 4
) AS indexes
它確實有效。我得到以下結果:
這是所需的輸出。問題是連接中 SELECTS 的設定數量。
問題是我必須這樣做:
SELECT 0 AS idx UNION
SELECT 1 AS idx UNION
SELECT 2 AS idx UNION
SELECT 3 AS idx UNION
SELECT 4
插入與 JSON 陣列中的專案一樣多的“idx”。有什么辦法可以用回圈來創建嗎?專案的計數將存盤在包含 JSON 的表中的單獨列“ howmany ”中。
這是我從中提取資料的表的樣子:

我試過迭代一段時間:
declare counter int unsigned default 0;
SELECT
idx,
REPLACE(JSON_EXTRACT(JSON_EXTRACT(json, CONCAT('$[', idx, ']')), CONCAT('$.from')), '"', '') AS 'from',
REPLACE(JSON_EXTRACT(JSON_EXTRACT(json, CONCAT('$[', idx, ']')), CONCAT('$.to')), '"', '') AS 'to',
json
FROM test.json
JOIN (
(while counter < howmany do
SELECT counter AS idx UNION
set counter=counter 1;
end WHILE)
) AS indexes
它失敗了。我 100% 肯定我嘗試的方式不是這樣做的方式,但我沒有想法。
編輯:我認為值得一提的是,我們不能使用 JSON_TABLE,因為我們的 MariaDB 版本比引入 JSON_TABLE 時稍早。
Edit2:我使用的是 Apache XAMPP 的 MySQL 服務器。
Database client version: libmysql - mysqlnd 5.0.12-dev - 20150407 - $Id: 7cc7cc96e675f6d72e5cf0f267f48e167c2abb23 $
MariaDB 版本10.3.32
uj5u.com熱心網友回復:
WITH RECURSIVE
cte AS (
SELECT id,
jsonvalue,
0 num,
JSON_UNQUOTE(JSON_EXTRACT(jsonvalue, CONCAT('$[', 0, '].from'))) `from`,
JSON_UNQUOTE(JSON_EXTRACT(jsonvalue, CONCAT('$[', 0, '].to'))) `to`
FROM test
UNION ALL
SELECT id,
jsonvalue,
1 num,
JSON_UNQUOTE(JSON_EXTRACT(jsonvalue, CONCAT('$[', 1 num, '].from'))),
JSON_UNQUOTE(JSON_EXTRACT(jsonvalue, CONCAT('$[', 1 num, '].to')))
FROM cte
WHERE JSON_EXTRACT(jsonvalue, CONCAT('$[', 1 num, '].from')) IS NOT NULL
)
SELECT id,
`from`,
`to`
FROM cte;
演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/367609.html
下一篇:在查詢中使用臨時表
