我正在尝试使用JSON_TABLE将对象的JSON数组映射到关系表列。
部件数组由指令数组组成。每个指令数组都包含具有三个名称值对的一致名称的对象。name字段的值始终是“家庭”、“功能”或“价格”。它们在数组中的顺序并不总是一致的。我认为可以使用列子句中的筛选条件将正确的值映射到正确的列。
WITH STR AS (
select
'
{
"Parts": [
{
"instruction": [
{
"name": "Family",
"value": "AJE",
"type": "0"
},
{
"name": "Feature",
"value": "AJKA",
"type": "0"
},
{
"name": "Price",
"value": "0",
"type": "0"
}
]
},
{
"instruction": [
{
"name": "Feature",
"value": "AJKB",
"type": "0"
},
{
"name": "Family",
"value": "AJA",
"type": "0"
}
]
}
]
}
' JSTR
FROM DUAL)
SELECT JT.*
FROM STR SO,
JSON_TABLE(SO.JSTR, '$.Parts[*].instruction[*]'
COLUMNS ("Family" PATH '$."value"?(@.name == "Family" )',
"Feature" PATH '$."value"?(@.name == "Feature")',
"Price" PATH '$."value"?(@.name == "Price")'
)
)
AS "JT"在显示代码时,它返回5行,所有字段都为null。我知道上面的代码是错的。下面是另一次尝试。此代码将返回数据(筛选条件注释掉,数组索引硬编码),但列数据映射错误。
JSON_TABLE(SO.JSTR, '$.Parts[*]' --ERROR ON ERROR
COLUMNS ("Family" PATH '$.instruction[0]."value"', --?(@.name == "Family" )
"Feature" PATH '$.instruction[1]."value"', --?(@.name == "Feature")
"Price" PATH '$.instruction[2]."value"' --?(@.name == "Price")
)
Family Feature Price
------ ------- -----
AJE AJKA 0
AJKA AJE
I'm trying to return this:
Family Feature Price
------ ------- -----
AJE AJKA 0
AJA AJKB发布于 2019-11-12 16:24:54
UPDATE:ORD应该计算指令,而不是单个值。
若要将所需的值放置在正确的列中,请调整路径:
SELECT JT.*
FROM STR SO,
JSON_TABLE(
SO.JSTR, '$.Parts[*].instruction'
COLUMNS (
ord for ordinality,
nested path '$[*]' columns (
Family path '$?(@.name == "Family").value',
Feature path '$?(@.name == "Feature").value',
Price path '$?(@.name == "Price").value'
)
)
)
AS "JT";
ORD FAMILY FEATURE PRICE
1 AJE
1 AJKA
1 0
2 AJKB
2 AJA 现在按ORD分组:
SELECT ord,
max(family) family,
max(feature) feature,
max(price) price
FROM STR SO,
JSON_TABLE(
SO.JSTR, '$.Parts[*].instruction'
COLUMNS (
ord for ordinality,
nested path '$[*]' columns (
Family path '$?(@.name == "Family").value',
Feature path '$?(@.name == "Feature").value',
Price path '$?(@.name == "Price").value'
)
)
)
AS "JT"
group by ord
order by ord;
ORD FAMILY FEATURE PRICE
1 AJE AJKA 0
2 AJA AJKB向你问好,斯托·阿什顿
发布于 2019-11-16 14:05:46
我希望StackOverflow的人总是总是提前指出他们的Oracle数据库版本。
无论如何,此黑客似乎在18c版中起作用:
SELECT ord,
max(json_value(jt.Family, '$.value')) family,
max(json_value(jt.Feature, '$.value')) feature,
max(json_value(jt.Price, '$.value')) price
FROM STR SO,
JSON_TABLE(
SO.JSTR, '$.Parts[*].instruction'
COLUMNS (
ord for ordinality,
nested path '$[*]' columns (
Family format json path '$?(@.name == "Family")',
Feature format json path '$?(@.name == "Feature")',
Price format json path '$?(@.name == "Price")'
)
)
)
AS "JT"
group by ord
order by ord;一个更好的解决方案是简化JSON并使用PIVOT子句来操作结果:
select family, feature, price
from (
SELECT jt.ord, jt.name, jt.value
from str,
JSON_TABLE(
str.JSTR, '$.Parts[*].instruction'
COLUMNS (
ord for ordinality,
nested path '$[*]' columns (
name varchar2(100) path '$.name',
value varchar2(100) path '$.value'
)
)
)
AS "JT"
)
pivot(max(value) for name in ('Family' as Family, 'Feature' as Feature, 'Price' as Price))
order by ord;https://stackoverflow.com/questions/58822140
复制相似问题