web-dev-qa-db-ja.com

MySQLのJSON配列を行としてリスト

MySQLテーブルAddressIdentifiersにJSON型の列Customersがあり、データサンプルは次のようになります。

[
  {
    "code": "123",
    "identifier": "0219d5780f6b",
    "type": "BILLING",
    "info": null
  },
  {
    "code": "240",
    "identifier": "c81aaf2c5a1f",
    "type": "DELIVERY",
    "info": null
  }
]

私はクエリを使用しています:

SELECT JSON_EXTRACT(AddressIdentifiers, '$**.identifier') As Identifier, JSON_EXTRACT(AddressIdentifiers, '$**.type') As AddressType FROM Customers WHERE CustomerId = 10003;

次のような出力を取得するには:

Identifier   AddressType
------------------------
0219d5780f6b  BILLING
c81aaf2c5a1f  DELIVERY

しかし、それはテーブルの行のような出力を与えず、代わりに連結された値を与えます。 (上記のように)行のようなJSON配列から出力を取得するにはどうすればよいですか?お知らせ下さい。

MySQLバージョン5.7.17を使用しています。

おかげで、
プラバット

編集-1:
Customersをキーとして持つAddressテーブル(列:Id、識別子、住所、都市、ピンコード)とこのidentifierテーブルを結合すると、各住所の行としてこれらの値をプルできると思いますか?

したがって、出力は次のようになります。

 Identifier   AddressType   Address  City
    -----------------------------------------
    0219d5780f6b  BILLING      Address-1  Hyderabad
    c81aaf2c5a1f  DELIVERY     Address-2  Delhi
1
Prabhat

私はMySQL 5.7にこのソリューションを用意しています。手動で作業を行う必要があります。 MySQL 8.0+の場合、単純に JSON_TABLE

SELECT
    JSON_EXTRACT(C.AddressIdentifiers, CONCAT('$[', Numbers.N - 1, '].Identifier')) AS Identifier,
    JSON_EXTRACT(C.AddressIdentifiers, CONCAT('$[', Numbers.N - 1, '].AddressType')) AS AddressType,
FROM
(
    SELECT @row := @row + 1 AS N FROM 
    (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) T2,
    (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) T1, 
    (SELECT @row:=0) T0
) Numbers -- Natural numbers from 1 to 100
INNER JOIN Customers C ON Numbers.N < JSON_LENGTH(C.AddressIdentifiers)
1
Alpha