【问题标题】:How to search in Json file attached in BLOB field using Oracle 12c?如何使用 Oracle 12c 在 BLOB 字段中附加的 Json 文件中进行搜索?
【发布时间】:2017-05-20 09:10:51
【问题描述】:

我想在 json 中搜索文本。该 json 保留在 blob 字段中。我创建了下表

CREATE TABLE APPLICATION
  (
    applicationId   VARCHAR2(36),
    customerId      VARCHAR2(36),
    assignee        VARCHAR2(36),
    status          VARCHAR2(36),
    applicationDate TIMESTAMP,
    closerDueDate   TIMESTAMP,
    closedDate      TIMESTAMP,
    application blob ,
    CONSTRAINT application CHECK(application IS JSON FORMAT JSON)) LOB (application) STORE AS(STORAGE (NEXT 15M));

为了保留一行,我使用 SQL Develop UI 添加所有字段值并将 json 文件附加到 blob 字段中。 blob 字段中附加的文件具有 json 文本(巨大的 json)。

文件示例

{
   "fields" : {
        "Customerid" : "Organization"
   }     
}
//Huge Json

我想使用路径在 blob 字段内进行搜索。点赞:fields.Customerid:"Organization"

我正在使用以下查询,但它没有得到任何行

select * 
from application app 
where dbms_lob.instr(app.application, utl_raw.CAST_TO_RAW('AutomationRuleSet'), 1, 1) > 0;

我知道值存在于 json 中持久化


编辑 1

如果我尝试:

Select app.application 
From APPLICATION app 
Where JSON_QUERY(app.application, '$.fields.CustomerID') = 'AutomationRuleSet';

我明白了:

Error que empieza en la línea 1 del comando: 
Select app.application From APPLICATION app Where JSON_QUERY(app.application, '$.fields.CustomerID') = 'AutomationRuleSet' 
Error en la línea de comandos:2 Columna:6 Informe de error: 
Error SQL: ORA-40499: no format defined for binary data type

有什么问题?

【问题讨论】:

  • @AlexPoole 如果我尝试:Select app.application From APPLICATION app Where JSON_QUERY(app.application, '$.fields.CustomerID') = 'AutomationRuleSet'; 我得到了:Error que empieza en la línea 1 del comando: Select app.application From APPLICATION app Where JSON_QUERY(app.application, '$.fields.CustomerID') = 'AutomationRuleSet' Error en la línea de comandos:2 Columna:6 Informe de error: Error SQL: ORA-40499: no format defined for binary data type
  • 不要在 cmets edit 你的问题中添加代码。
  • @a_horse_with_no_name 我同意你的观点,但根据文档 BLOB 允许持久化 json。你怎么知道 CLOB 是 JSON 的推荐格式?
  • @AlexPoole:啊不知道。不过这很愚蠢,因为 BLOB 很难在普通 SQL 中使用 - 使用 CLOB 来查看内容要容易得多。

标签: sql json oracle blob oracle12c


【解决方案1】:

您可以找到 JSON BLOBS 包含带有 json_exists() 的键路径的行:

select * from application app
where json_exists(app.application, '$.fields.Customerid');

您可以使用json_value() 搜索特定值:

select * from application app
where json_value(app.application, '$.fields.Customerid') = 'AutomationRuleSet';

当您使用 BLOB 时,您可能需要指定 format json,尽管在 12.2 和您的表定义中测试时我似乎不需要:

select * from application app
where json_exists(application format json, '$.fields.Customerid');

select * from application app
where json_value(application format json, '$.fields.Customerid') = 'AutomationRuleSet';

Oracle Live SQL demo.

【讨论】:

  • 我收到了Error SQL: ORA-40499: no format defined for binary data type 错误
  • 如何打开文件并搜索文本?
  • 添加format json 对这些或您的json_query 尝试有帮助吗?我已经更新了答案以显示它的去向。
【解决方案2】:

快速解决方案: 我找到了解决方案,基本上我必须将 BLOB 转换为 VARCHAR2

select UTL_RAW.CAST_TO_VARCHAR2( DBMS_LOB.SUBSTR( app.application, 4000, 1 )) AS aplication
from application app
Where JSON_VALUE(UTL_RAW.CAST_TO_VARCHAR2( DBMS_LOB.SUBSTR( app.application, 4000, 1 )), '$.fields.Customerid') = 'AutomationRuleSet';

其他解决方案:

使用JSON_TABLE并使用json字段创建表

【讨论】:

  • 你不应该这样做。在函数调用中添加了json format,您是否仍然收到错误消息?
猜你喜欢
  • 1970-01-01
  • 2016-06-04
  • 2021-01-24
  • 1970-01-01
  • 2017-09-06
  • 2018-09-02
  • 2011-09-13
  • 1970-01-01
  • 2014-12-25
相关资源
最近更新 更多