查询 json 来自 oracle 12.1 的数据,其字段值带有“.”
query json data from oracle 12.1 having fields value with "."
我有一个 table 存储了 JSON 数据,我在查询中使用了 json_exists
函数。下面是我在其中一行的列中的示例数据。
{"fields":["query.metrics.metric1.field1",
"query.metrics.metric1.field2",
"query.metrics.metric1.field3",
"query.metrics.metric2.field1",
"query.metrics.metric2.field2"]}
我想要所有具有特定字段的行。所以,我在下面尝试。
SELECT COUNT(*)
FROM my_table
WHERE JSON_EXISTS(fields, '$.fields[*]."query.metrics.metric1.field1"');
它没有给我任何结果。不知道我在这里错过了什么。请帮忙。
谢谢
我不知道如何在数组元素上进行“模式匹配”,但只需解析整个内容并进行过滤即可。
with t(x, json) as (
select 1, q'|{"fields":["a", "b"]}|' from dual union all
select 2, q'|{"fields":["query.metrics.metric1.field1","query.metrics.metric1.field2","query.metrics.metric1.field3","query.metrics.metric2.field1","query.metrics.metric2.field2"]}|' from dual
)
select t.*
from t
where exists (
select null
from json_table(
t.json,
'$.fields[*]'
columns (
array_element varchar2(100) path '$'
)
)
where array_element = 'query.metrics.metric1.field1'
);
在您的代码中,您正在访问 fields
数组中对象的字段 "query.metrics.metric1.field1"
,但没有该对象(元素是字符串)...
您可以使用 @
运算符来引用数组 fields
的出现,例如
SELECT *
FROM my_table
WHERE JSON_EXISTS(fields, '$.fields?(@=="query.metrics.metric1.field1")')
编辑:以上案例适用于12R2+
,考虑到它不适用于您的版本(12R1
),尝试使用JSON_TABLE()
例如
SELECT fields
FROM my_table,
JSON_TABLE(fields, '$.fields[*]' COLUMNS ( js VARCHAR2(90) PATH '$' ))
WHERE js = 'query.metrics.metric1.field1'
我有一个 table 存储了 JSON 数据,我在查询中使用了 json_exists
函数。下面是我在其中一行的列中的示例数据。
{"fields":["query.metrics.metric1.field1",
"query.metrics.metric1.field2",
"query.metrics.metric1.field3",
"query.metrics.metric2.field1",
"query.metrics.metric2.field2"]}
我想要所有具有特定字段的行。所以,我在下面尝试。
SELECT COUNT(*)
FROM my_table
WHERE JSON_EXISTS(fields, '$.fields[*]."query.metrics.metric1.field1"');
它没有给我任何结果。不知道我在这里错过了什么。请帮忙。
谢谢
我不知道如何在数组元素上进行“模式匹配”,但只需解析整个内容并进行过滤即可。
with t(x, json) as (
select 1, q'|{"fields":["a", "b"]}|' from dual union all
select 2, q'|{"fields":["query.metrics.metric1.field1","query.metrics.metric1.field2","query.metrics.metric1.field3","query.metrics.metric2.field1","query.metrics.metric2.field2"]}|' from dual
)
select t.*
from t
where exists (
select null
from json_table(
t.json,
'$.fields[*]'
columns (
array_element varchar2(100) path '$'
)
)
where array_element = 'query.metrics.metric1.field1'
);
在您的代码中,您正在访问 fields
数组中对象的字段 "query.metrics.metric1.field1"
,但没有该对象(元素是字符串)...
您可以使用 @
运算符来引用数组 fields
的出现,例如
SELECT *
FROM my_table
WHERE JSON_EXISTS(fields, '$.fields?(@=="query.metrics.metric1.field1")')
编辑:以上案例适用于12R2+
,考虑到它不适用于您的版本(12R1
),尝试使用JSON_TABLE()
例如
SELECT fields
FROM my_table,
JSON_TABLE(fields, '$.fields[*]' COLUMNS ( js VARCHAR2(90) PATH '$' ))
WHERE js = 'query.metrics.metric1.field1'