[英]Extract values from JSON in Oracle
I need to extract the value of marketDescription
and channelName
attributes as two different columns from the below JSON:我需要从以下 JSON 中提取
marketDescription
和channelName
属性的值作为两个不同的列:
{
'betType':'SYSTEM',
'multiplier':1,
'selections':[
{
'marketId':'/vfl/vf:match:1266330425/SCR/FT/1X2',
'marketDescription':'Maç Sonucu',
'betSelectionId':'/vfl/vf:match:1266330425/SCR/FT/1X2/1',
'betSelectionDescription':'K. MAKEDONYA',
'odds':50000,
'event':{
'eventId':'vf:match:1266330425',
'channelType':'VFEC',
'channelName':'Maç günü 3',
'timestamp':'2021-07-16T10:44:43.000Z',
'homeTeam':'K. MAKEDONYA',
'awayTeam':'HOLLANDA'
}
},
{
'marketId':'/vfl/vf:match:1266330427/SCR/FT/1X2',
'marketDescription':'Maç Sonucu',
'betSelectionId':'/vfl/vf:match:1266330427/SCR/FT/1X2/1',
'betSelectionDescription':'AVUSTURYA',
'odds':24500,
'event':{
'eventId':'vf:match:1266330427',
'channelType':'VFEC',
'channelName':'Maç günü 3',
'timestamp':'2021-07-16T10:44:43.000Z',
'homeTeam':'AVUSTURYA',
'awayTeam':'UKRAYNA'
}
},
{
'marketId':'/vfl/vf:match:1266330437/SCR/FT/1X2',
'marketDescription':'Maç Sonucu',
'betSelectionId':'/vfl/vf:match:1266330437/SCR/FT/1X2/1',
'betSelectionDescription':'İSKOÇYA',
'odds':33500,
'event':{
'eventId':'vf:match:1266330437',
'channelType':'VFEC',
'channelName':'Maç günü 3',
'timestamp':'2021-07-16T10:44:43.000Z',
'homeTeam':'İSKOÇYA',
'awayTeam':'HIRVATİSTAN'
}
}
]
}
Expected result :预期结果 :
marketDescription channelName
Maç Sonucu Maç günü 3
I tried to use JSON_VALUE command but I don't know how to extract them.我尝试使用 JSON_VALUE 命令,但我不知道如何提取它们。
Given your JSON structure, you can use json_table
rather than json_value
:鉴于您的 JSON 结构,您可以使用
json_table
而不是json_value
:
select marketDescription, channelName
from json_table (
<your_json_string>,
'$.selections[*]'
columns
marketDescription varchar2(20) path '$.marketDescription',
channelName varchar2(20) path '$.event.channelName'
)
Plugging in your example as a single line for brevity:为简洁起见,将您的示例插入一行:
select marketDescription, channelName
from json_table (
q'^{'betType':'SYSTEM','multiplier':1,'selections':[{'marketId':'/vfl/vf:match:1266330425/SCR/FT/1X2','marketDescription':'Maç Sonucu','betSelectionId':'/vfl/vf:match:1266330425/SCR/FT/1X2/1','betSelectionDescription':'K. MAKEDONYA','odds':50000,'event':{'eventId':'vf:match:1266330425','channelType':'VFEC','channelName':'Maç günü 3','timestamp':'2021-07-16T10:44:43.000Z','homeTeam':'K. MAKEDONYA','awayTeam':'HOLLANDA'}},{'marketId':'/vfl/vf:match:1266330427/SCR/FT/1X2','marketDescription':'Maç Sonucu','betSelectionId':'/vfl/vf:match:1266330427/SCR/FT/1X2/1','betSelectionDescription':'AVUSTURYA','odds':24500,'event':{'eventId':'vf:match:1266330427','channelType':'VFEC','channelName':'Maç günü 3','timestamp':'2021-07-16T10:44:43.000Z','homeTeam':'AVUSTURYA','awayTeam':'UKRAYNA'}},{'marketId':'/vfl/vf:match:1266330437/SCR/FT/1X2','marketDescription':'Maç Sonucu','betSelectionId':'/vfl/vf:match:1266330437/SCR/FT/1X2/1','betSelectionDescription':'İSKOÇYA','odds':33500,'event':{'eventId':'vf:match:1266330437','channelType':'VFEC','channelName':'Maç günü 3','timestamp':'2021-07-16T10:44:43.000Z','homeTeam':'İSKOÇYA','awayTeam':'HIRVATİSTAN'}}]}^' format json,
'$.selections[*]'
columns
marketDescription varchar2(20) path '$.marketDescription',
channelName varchar2(20) path '$.event.channelName'
)
gives给
MARKETDESCRIPTION CHANNELNAME
-------------------- --------------------
Maç Sonucu Maç günü 3
Maç Sonucu Maç günü 3
Maç Sonucu Maç günü 3
It gets the values from each array element.它从每个数组元素中获取值。 They happen to be the same here, so you can just add
distinct
if you only want to see one of each combination.它们在这里碰巧是相同的,因此如果您只想查看每个组合中的一个,您可以添加
distinct
。
with t as (
select q'[
{
'betType':'SYSTEM',
'multiplier':1,
'selections':[
{
'marketId':'/vfl/vf:match:1266330425/SCR/FT/1X2',
'marketDescription':'Mac Sonucu',
'betSelectionId':'/vfl/vf:match:1266330425/SCR/FT/1X2/1',
'betSelectionDescription':'K. MAKEDONYA',
'odds':50000,
'event':{
'eventId':'vf:match:1266330425',
'channelType':'VFEC',
'channelName':'Mac gunu 3',
'timestamp':'2021-07-16T10:44:43.000Z',
'homeTeam':'K. MAKEDONYA','awayTeam':'HOLLANDA'
}
},
{
'marketId':'/vfl/vf:match:1266330427/SCR/FT/1X2',
'marketDescription':'Mac Sonucu',
'betSelectionId':'/vfl/vf:match:1266330427/SCR/FT/1X2/1',
'betSelectionDescription':'AVUSTURYA',
'odds':24500,
'event':{
'eventId':'vf:match:1266330427',
'channelType':'VFEC',
'channelName':'Mac gunu 3',
'timestamp':'2021-07-16T10:44:43.000Z',
'homeTeam':'AVUSTURYA',
'awayTeam':'UKRAYNA'
}
},
{
'marketId':'/vfl/vf:match:1266330437/SCR/FT/1X2',
'marketDescription':'Mac Sonucu',
'betSelectionId':'/vfl/vf:match:1266330437/SCR/FT/1X2/1',
'betSelectionDescription':'ISKOCYA',
'odds':33500,
'event':{
'eventId':'vf:match:1266330437',
'channelType':'VFEC',
'channelName':'Mac gunu 3',
'timestamp':'2021-07-16T10:44:43.000Z',
'homeTeam':'ISKOCYA','awayTeam':'HIRVATISTAN'
}
}
]
}
]' js
from dual
)
select
j.*
from t,
json_table(
t.js,
'$.selections[*]'
columns(
n for ordinality
,marketId path '$.marketId'
,marketDescription path '$.marketDescription'
,channelName path '$.event.channelName'
)
) j
Results:结果:
N MARKETID MARKETDESCRIPTION CHANNELNAME
---------- ----------------------------------- -------------------- --------------------
1 /vfl/vf:match:1266330425/SCR/FT/1X2 Mac Sonucu Mac gunu 3
2 /vfl/vf:match:1266330427/SCR/FT/1X2 Mac Sonucu Mac gunu 3
3 /vfl/vf:match:1266330437/SCR/FT/1X2 Mac Sonucu Mac gunu 3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.