我有一个名为BLOBFIELD的blob字段表。
此:
SELECT A.ID
FROM A AP
WHERE JSON_VALUE(
AP.BLOBFIELD format json,
'$.arrays.AAA.arrays.BBB.fields.Name'
) = 'peter'
当我使用equals时,工作正常。但是这个:
SELECT A.ID
FROM A AP
WHERE JSON_VALUE(
AP.BLOBFIELD format json,
'$.arrays.AAA.arrays.BBB.fields.Name'
) LIKE 'peter%'
和
SELECT A.ID
FROM A AP
WHERE (JSON_VALUE(
AP.BLOBFIELD format json,
'$.arrays.AAA.arrays.BBB.fields.Name'
)) LIKE '%peter%'
我没有错误,但我认为它不起作用,因为AAA和BBB是数组
我发现regex_like但是这个函数接收第一个值为字段,但是我没有字段我有一个json路径。
SELECT A.ID FROM A AP
WHERE JSON_VALUE( AP.BLOBFIELD format json, '$.arrays.AAA[*].arrays.BBB[*].fields.Name' ERROR ON ERROR ) LIKE 'peter%'
无效。如何使用LIKE
让它工作?
答案 0 :(得分:1)
JSON_VALUE不能用于访问文档中多次出现的键。例如,如果密钥或其任何父项是数组,则无法通过JSON_VALUE访问内容,除非JSON_PATH表达式使用索引来标识数组的特定成员。
我们需要使用JSON_TABLE来解决这个......
SQL> WITH A as
2 ( select 1 ID,
3 '{"arrays":[{"AAA":{"arrays":[{"BBB":{"fields":{"Name":"Max"}}},{"BBB":{"fields":{"Name":"Mike"}}}]}},{"AA
A":{"arrays":[{"BBB":{"fields":{"Name":"Mark"}}},{"BBB":{"fields":{"Name":"Matt"}}}]}}]}' BLOBFIELD
4 from DUAL
5 union all
6 select 2 ID,
7 '{"arrays":[{"AAA":{"arrays":[{"BBB":{"fields":{"Name":"Pat"}}},{"BBB":{"fields":{"Name":"Pete"}}}]}},{"AA
A":{"arrays":[{"BBB":{"fields":{"Name":"Paul"}}},{"BBB":{"fields":{"Name":"Pascal"}}}]}}]}' BLOBFIELD
8 from DUAL
9 )
10 SELECT distinct AP.ID
11 FROM A AP,
12 JSON_TABLE(
13 AP.BLOBFIELD,
14 '$.arrays[*]'
15 COLUMNS
16 NESTED PATH
17 '$.AAA.arrays[*]'
18 COLUMNS (
19 NAME VARCHAR2(32) PATH '$.BBB.fields.Name'
20 )
21 )
22 where NAME LIKE '%Pete%'
23
SQL> /
2
只是为了完整。
没有JSON_VALUE行的原因是默认的“NULL ON ERROR”行为。这可以通过添加ERROR OR ERROR子句来看到,如下所示
SQL> WITH A as
2 ( select 1 ID,
3 '{"arrays":[{"AAA":{"arrays":[{"BBB":{"fields":{"Name":"Max"}}},{"BBB":{"fields":{"Name":"Mike"}}}]}},{"AA
A":{"arrays":[{"BBB":{"fields":{"Name":"Mark"}}},{"BBB":{"fields":{"Name":"Matt"}}}]}}]}' BLOBFIELD
4 from DUAL
5 union all
6 select 2 ID,
7 '{"arrays":[{"AAA":{"arrays":[{"BBB":{"fields":{"Name":"Pat"}}},{"BBB":{"fields":{"Name":"Pete"}}}]}},{"AA
A":{"arrays":[{"BBB":{"fields":{"Name":"Paul"}}},{"BBB":{"fields":{"Name":"Pascal"}}}]}}]}' BLOBFIELD
8 from DUAL
9 )
10 SELECT AP.ID
11 FROM A AP
12 WHERE JSON_VALUE(
13 AP.BLOBFIELD format json,
14 '$.arrays.AAA.arrays.BBB.fields.Name'
15 ) LIKE 'peter%'
16 /
no rows selected
SQL> WITH A as
2 ( select 1 ID,
3 '{"arrays":[{"AAA":{"arrays":[{"BBB":{"fields":{"Name":"Max"}}},{"BBB":{"fields":{"Name":"Mike"}}}]}},{"AA
A":{"arrays":[{"BBB":{"fields":{"Name":"Mark"}}},{"BBB":{"fields":{"Name":"Matt"}}}]}}]}' BLOBFIELD
4 from DUAL
5 union all
6 select 2 ID,
7 '{"arrays":[{"AAA":{"arrays":[{"BBB":{"fields":{"Name":"Pat"}}},{"BBB":{"fields":{"Name":"Pete"}}}]}},{"AA
A":{"arrays":[{"BBB":{"fields":{"Name":"Paul"}}},{"BBB":{"fields":{"Name":"Pascal"}}}]}}]}' BLOBFIELD
8 from DUAL
9 )
10 SELECT AP.ID
11 FROM A AP
12 WHERE JSON_VALUE(
13 AP.BLOBFIELD format json,
14 '$.arrays.AAA.arrays.BBB.fields.Name'
15 ERROR ON ERROR
16 ) LIKE 'peter%'
17 /
FROM A AP
*
ERROR at line 11:
ORA-40470: JSON_VALUE evaluated to multiple values
SQL>
答案 1 :(得分:0)
我使用LIKE运行JSON_VALUE并且它运行良好。我测试了12.1.0.2 RELEASE和更高版本。 如果在JSON_VALUE中使用ERROR ON ERROR子句会发生什么?
SELECT A.ID 来自AP WHERE JSON_VALUE( AP.BLOBFIELD格式json, ' $ arrays.AAA.arrays.BBB.fields.Name'错误的错误 )喜欢' peter%'
你看到错误吗?