简体   繁体   English

在 Oracle 中从 JSON 中提取值

[英]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 中提取marketDescriptionchannelName属性的值作为两个不同的列:

{
  '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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM