簡體   English   中英

MySQL 和 JSON - 將數組轉換為行

[英]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.

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