【问题标题】:ORACLE -LIKE condition in JSON_VALUE (BLOB FIELD) not working?JSON_VALUE(BLOB FIELD)中的 ORACLE -LIKE 条件不起作用?
【发布时间】:2017-07-05 17:15:45
【问题描述】:

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

【问题讨论】:

  • “不工作”是指出现错误,还是没有返回结果?
  • 没有返回结果
  • 此链接stackoverflow.com/a/16301995/3377472 显示示例。
  • 将是 dbms_lob.instr(AP.BLOBFIELD,utl_raw.CAST_TO_RAW('hello'),1,1)>0 但我有一个 json_value JSON_VALUE(AP.BLOBFIELD format json, '$.arrays .AAA.arrays.BBB.fields.Name')

标签: sql json oracle blob oracle12c


【解决方案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>

【讨论】:

    【解决方案2】:

    我使用 LIKE 运行 JSON_VALUE,它运行良好。我在 12.1.0.2 RELEASE 及更高版本上进行了测试。 如果在 JSON_VALUE 中使用 ERROR ON ERROR 子句会怎样?

    选择 A.ID 来自 AP 在哪里 JSON_VALUE( AP.BLOBFIELD 格式 json, '$.arrays.AAA.arrays.BBB.fields.Name' 出错时出错 ) LIKE 'peter%'

    您看到错误了吗?

    【讨论】:

    • 我没有错误,但我认为它不起作用,因为 AAA 和 BBB 是数组示例。从 AP WHERE JSON_VALUE 中选择 A.ID(AP.BLOBFIELD 格式 json,'$.arrays.AAA[].arrays.BBB[].fields.Name' ERROR ON ERROR) LIKE 'peter% '
    猜你喜欢
    • 2011-06-02
    • 2020-02-04
    • 2021-02-12
    • 2019-07-19
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 2019-09-27
    • 2016-01-02
    相关资源
    最近更新 更多