PDA

View Full Version : Json mit SQL auslesen



Domeus
18-12-24, 10:40
Hallo zusammen,

ich habe die unten stehende JSON Datei und möchte diese mit folgendem SQL auslesen:



SELECT *
FROMJSON_TABLE(
(Select line fromtable(qsys2.ifs_read_utf8('/test/so3.json')) fetchfirstrowonly),
'$'
COLUMNS (
VOUCHERTYPE VARCHAR(10) PATH'$.vouchertype',
VOUCHERNO VARCHAR(20) PATH'$.voucherno',
WAREHOUSENO VARCHAR(10) PATH'$.warehouseno',

NESTED'$.supplier'
COLUMNS (
SUPPLIERNO VARCHAR(15) PATH'$.supplierno',
NAME1 VARCHAR(50) PATH'$.name1',
EMAIL VARCHAR(50) PATH'$.email',
PHONE VARCHAR(30) PATH'$.phone',
NESTED'$.address
'
COLUMNS (
STREET VARCHAR(50) PATH'$.street',
ZIPCODE VARCHAR(10) PATH'$.zipcode',
CITY VARCHAR(50) PATH'$.city',
ADDRESSTYPE VARCHAR(10) PATH'$.addresstype',
COUNTRYCODETYPE VARCHAR(10) PATH'$.countrycodetype',
COUNTRYCODE VARCHAR(5) PATH'$.countrycode'
)
),

NESTED'$.lineitems
'
COLUMNS (
SKU VARCHAR(50) PATH'$.sku',
LINEITEMNO VARCHAR(10) PATH'$.lineitemno',
ARTICLENAME VARCHAR(100) PATH'$.articlename',
ORDEREDQUANTITY DECIMAL(10,2) PATH'$.orderedquantity',

NESTED'$.productcodes
'
COLUMNS (
PRODUCTCODETYPE VARCHAR(10) PATH'$.type',
PRODUCTCODE VARCHAR(50) PATH'$.value'
)
)
)
);


Warum bekomme ich dann zwei Zeilen und nicht eine? Wahrscheinlich hängt es mit meinem Gebrauch der NESTED zusammen aber ich schaffe es einfach nicht, dass er alles in einer Zeile ausliest:
683
Wäre sehr nett wenn mir hier jemand bitte eine Tipp geben kann.

Hier das Json:


{
"vouchertype": "AB",
"voucherno": "1234567",
"warehouseno": "123",
"supplier": {
"name1": "Test GmbH",
"email": "info@test.com",
"phone": "012345-6789",
"address": [
{
"street": "Test-Straße 33",
"zipcode": "12345",
"city": "Testort",
"addresstype": "HOME",
"countrycodetype": "ISO31661",
"countrycode": "DE"
}
],
"supplierno": "12345"
},
"lineitems": [
{
"sku": "1234567890",
"lineitemno": "1.000",
"articlename": "Testartikel",
"orderedquantity": 100,
"productcodes": [
{
"type": "EAN",
"value": "1234567890"
}
]
}
]
}


Gruß
Sebastian

TR1
19-12-24, 14:14
Was ist wenn es mehrere Adressen gibt?
Wie soll er sich dann verhalten?
Aber wenn es nur eine Adresse gibt, könntest du es auch ggf. so lösen:




<style>body { font-family:Monospaced; font-size:17px; }</style>SELECT *
FROM JSON_TABLE(
(Select line from table(qsys2.ifs_read_utf8('/test/so3.json')) fetch first row only),
'$'
COLUMNS (
VOUCHERTYPE VARCHAR(10) PATH'$.vouchertype',
VOUCHERNO VARCHAR(20) PATH'$.voucherno',
WAREHOUSENO VARCHAR(10) PATH'$.warehouseno',
SUPPLIERNO VARCHAR(15) PATH'$.supplier.supplierno',
NAME1 VARCHAR(50) PATH'$.supplier.name1',
EMAIL VARCHAR(50) PATH'$.supplier.email',
PHONE VARCHAR(30) PATH'$.supplier.phone',
NESTED '$.supplier.address
'
COLUMNS (
STREET VARCHAR(50) PATH'$.street',
ZIPCODE VARCHAR(10) PATH'$.zipcode',
CITY VARCHAR(50) PATH'$.city',
ADDRESSTYPE VARCHAR(10) PATH'$.addresstype',
COUNTRYCODETYPE VARCHAR(10) PATH'$.countrycodetype',
COUNTRYCODE VARCHAR(5) PATH'$.countrycode'
),

NESTED '$.lineitems
'
COLUMNS (
SKU VARCHAR(50) PATH'$.sku',
LINEITEMNO VARCHAR(10) PATH'$.lineitemno',
ARTICLENAME VARCHAR(100) PATH'$.articlename',
ORDEREDQUANTITY DECIMAL(10,2) PATH'$.orderedquantity',

NESTED '$.productcodes
'
COLUMNS (
PRODUCTCODETYPE VARCHAR(10) PATH'$.type',
PRODUCTCODE VARCHAR(50) PATH'$.value'
)
)
)
);