在Oracle json表列中获取节点名称

时间:2017-10-11 09:49:40

标签: json oracle key

我在Oracle中有一个具有JSON字段的表,我会访问一个键名而不是它的值,因为它是可变的,并且无法知道它。

例如,您可以想象json root中的第一个元素是此项,因此您有一次$.keyname1而另一次$.keyname2

我会检查$[0]键名是第一个还是第二个。

2 个答案:

答案 0 :(得分:1)

据我所知,由于甲骨文并未真正认真对待JSON,因此仍然难以做到这一点。

如果您使用的是Oracle 12.2或更高版本,则可以使用the get_keys() function for the PL/SQL type JSON_OBJECT_T

如果您有早期版本(或者更喜欢JSON_OBJECT_T的替代版本),则可以使用the get_keys() function in the popular pljson library

如果您处于其他受限制的环境中,那太糟糕了。您可能不得不在JSON字符串上执行某种可怕的substr。我不推荐这个。

select regexp_substr('{a:100, b:200, c:300}', '[^{:]+') as first_node from dual;

如果您不能使用其中一个get_keys()函数并且想要更好的解决方案,我还建议您可以修改应用程序的json生成部分以包含变量node /使用已知密钥名称的密钥名称,以便您可以访问它们。例如。

{ variable_keys : ["keyname1","keyname2"],
  keyname1      : "value1",
  keyname2      : "value2" }

但是你仍然需要PL / SQL,因为SQL JSON函数(json_value,json_query)只接受JSON Path Expression的字符串文字。

答案 1 :(得分:0)

您还可以使用sql聚合函数json_dataguide或plsql DBMS_JSON.get_index_dataguide来获取键列表。威尔(Wil)进行了额外的工作以从结果中删除名称。

SQL示例:

select  dataguide.*  
from ( 
  select json_dataguide(json_column )   da 
  from  json_table 
  where key = :1 
) d , 
json_table(
    da  , '$[*]'  COLUMNS (
       f_path   VARCHAR2(128 CHAR) PATH '$."o:path"'
     , f_type   VARCHAR2(128 CHAR) PATH '$."type"'
     , f_length   VARCHAR2(128 CHAR) PATH '$."o:length"'
    )
) dataguide ;