我在Oracle中有一个具有JSON字段的表,我会访问一个键名而不是它的值,因为它是可变的,并且无法知道它。
例如,您可以想象json root中的第一个元素是此项,因此您有一次$.keyname1
而另一次$.keyname2
。
我会检查$[0]
键名是第一个还是第二个。
答案 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 ;