首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JSON_TABLE滤波条件问题

JSON_TABLE滤波条件问题
EN

Stack Overflow用户
提问于 2019-11-12 15:49:39
回答 2查看 1.4K关注 0票数 2

我正在尝试使用JSON_TABLE将对象的JSON数组映射到关系表列。

部件数组由指令数组组成。每个指令数组都包含具有三个名称值对的一致名称的对象。name字段的值始终是“家庭”、“功能”或“价格”。它们在数组中的顺序并不总是一致的。我认为可以使用列子句中的筛选条件将正确的值映射到正确的列。

代码语言:javascript
运行
复制
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。我知道上面的代码是错的。下面是另一次尝试。此代码将返回数据(筛选条件注释掉,数组索引硬编码),但列数据映射错误。

代码语言:javascript
运行
复制
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
EN

回答 2

Stack Overflow用户

发布于 2019-11-12 16:24:54

UPDATE:ORD应该计算指令,而不是单个值。

若要将所需的值放置在正确的列中,请调整路径:

代码语言:javascript
运行
复制
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分组:

代码语言:javascript
运行
复制
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

向你问好,斯托·阿什顿

票数 0
EN

Stack Overflow用户

发布于 2019-11-16 14:05:46

我希望StackOverflow的人总是总是提前指出他们的Oracle数据库版本。

无论如何,此黑客似乎在18c版中起作用:

代码语言:javascript
运行
复制
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子句来操作结果:

代码语言:javascript
运行
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58822140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档