[英]MySQL and JSON - transform array to rows
假設我們有以下變量:
SET @j = '[10, 20, {"a": "bbb"}]';
問題是如何將項目提取為行?
基本查詢,像這樣:
SELECT JSON_EXTRACT(@j, '$');
返回與輸入相同的值,但我想要這樣的東西:
10
20
{"a", "bbb"}
這該怎么做?
以下是將數組轉換為行的三種方法。 使用相同的假定JSON值:
SET @j = '[10, 20, {"a": "bbb"}]';
使用內嵌數字表。 MySQL和MariaDB兼容:
WITH sequenceGenerator (sequenceNumber) AS (
SELECT 0 AS sequenceNumber
UNION ALL
SELECT 1
UNION ALL
SELECT 2
)
SELECT
JSON_EXTRACT(@j, CONCAT('$[', sequenceNumber, ']')) AS arrayValue
FROM
sequenceGenerator;
使用MySQL 8.0.4+ JSON_TABLE():
SELECT
arrayValue
FROM
JSON_TABLE(
@j,
'$[*]'
COLUMNS(
arrayValue JSON PATH '$')
) AS tt;
使用MariaDB SEQUENCE Engine刪除內聯序列表:
SELECT
JSON_EXTRACT(@j, CONCAT('$[', seq, ']')) AS arrayValue
FROM
seq_0_to_2;
要在MariaDB中使用更多通用,請對數組長度使用“最佳猜測”最大值,然后將序列限制為JSON長度。 此示例假定最大的數組將包含1024個或更少的元素:
SELECT
JSON_EXTRACT(@j, CONCAT('$[', seq, ']')) AS arrayValue
FROM
seq_0_to_1024 AS sequenceTable
WHERE
sequenceTable.seq < JSON_LENGTH(@j);
如果Kevin 的回答包含一個轉換實際 JSON 列而不是變量內容的示例,那么它會對我有用。
對於由以下內容組成的表:
mysql> select * from departmentTable;
+----+-----------------------+
| id | departments |
+----+-----------------------+
| 1 | ["300", "310", "320"] |
| 2 | ["400", "405", "740"] |
+----+-----------------------+
2 rows in set (0.01 sec)
mysql>
以下 SQL 將工作(使用 MySQL 8.0.30 進行測試,但它可能也適用於早期的次要版本):
select x.singleDepartment
from departmentTable dt
cross join json_table(
dt.departments,
'$[*]'
columns (
singleDepartment varchar(50) PATH '$'
)
) x
WHERE dt.id = 1 ;
Output:
mysql> select x.singleDepartment
-> from departmentTable dt
-> cross join json_table(
-> js.departments,
-> '$[*]'
-> columns (
-> singleDepartment varchar(50) PATH '$'
-> )
-> ) x
-> WHERE dt.id = 1 ;
+------------------+
| singleDepartment |
+------------------+
| 300 |
| 310 |
| 320 |
+------------------+
3 rows in set (0.01 sec)
mysql>
如果您使用查詢的 output 作為另一個查詢的輸入(我的案例是SELECT * FROM table WHERE doc IN (the_query_mentioned_earlier)
),您會收到以下錯誤:
Illegal mix of collations (utf8mb4_0900_ai_ci,IMPLICIT) and (utf8mb4_unicode_ci,IMPLICIT) for operation '='
顯式轉換 SELECT 中列的排序規則(遵循MySQL 文檔):
select x.singleDepartment COLLATE utf8mb4_0900_ai_ci as singleDepartment
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.