JAC_VALUE(BLOB FIELD)中的ORACLE -LIKE条件不起作用?

时间:2017-02-16 14:21:57

标签: sql json oracle blob oracle12c

我有一个名为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让它工作?

2 个答案:

答案 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%'

你看到错误吗?