Sql Oracle数据库12c:Oracle JSON查询搜索

Sql Oracle数据库12c:Oracle JSON查询搜索,sql,json,oracle,oracle12c,Sql,Json,Oracle,Oracle12c,创建两种类型的表来存储JSON值BLOB和NCLOB,我的目标是从JSON表中搜索所需的值 代码片段1:创建一列为NCLOB的表 create table departments_json_nclob ( department_id integer not null primary key, department_data NCLOB not null ); 具有多字节字符的简单插入值:məharaːʂʈrə: 代码片段2:现在,我创建了另一个具有BLOB数据类型的表: creat

创建两种类型的表来存储JSON值BLOB和NCLOB,我的目标是从JSON表中搜索所需的值

代码片段1:创建一列为NCLOB的表

create table departments_json_nclob (
  department_id   integer not null primary key,
  department_data NCLOB not null
);
具有多字节字符的简单插入值:məharaːʂʈrə:

代码片段2:现在,我创建了另一个具有BLOB数据类型的表:

create table departments_json (
  department_id   integer not null primary key,
  department_data blob not null
);
添加了仅允许JSON的约束

alter table departments_json
  add constraint dept_data_json 
  check ( department_data is JSON FORMAT JSON STRICT );
插入普通JSON

insert into departments_json 
  values ( 100, utl_raw.cast_to_raw ('{"department_list":[{"Deptname":"DEPT-A", "value" : "məharaːʂʈrə"}]}'));
从以下查询验证插入:

SELECT json_value(department_data format json, '$.department_list.value'  ) 
FROM departments_json JS 
WHERE DEPARTMENT_ID=100;
SELECT json_value(department_data format json, '$.department_list.value'  ) 
FROM departments_json JS 
WHERE DEPARTMENT_ID=101;
SELECT *
FROM   departments_json
WHERE JSON_value(department_data format json, '$.department_list.value') = ('məharaːʂʈrə');

SELECT *
FROM   departments_json
WHERE JSON_TEXTCONTAINS(department_data,  '$.department_list.value', 'məharaːʂʈrə')
输出为:məharaːʂʈrə

现在,我将在同一个表中再插入一次,即“departments_json”,但这次我将从NCLOB表departments_json_NCLOB中获取所需的插入值:

再次使用以下查询验证插入:

SELECT json_value(department_data format json, '$.department_list.value'  ) 
FROM departments_json JS 
WHERE DEPARTMENT_ID=100;
SELECT json_value(department_data format json, '$.department_list.value'  ) 
FROM departments_json JS 
WHERE DEPARTMENT_ID=101;
SELECT *
FROM   departments_json
WHERE JSON_value(department_data format json, '$.department_list.value') = ('məharaːʂʈrə');

SELECT *
FROM   departments_json
WHERE JSON_TEXTCONTAINS(department_data,  '$.department_list.value', 'məharaːʂʈrə')
输出为:məharaːʂʈrə

现在我的问题是:

当我搜索多字节字符时,查询只返回一个直接插入BLOB表的查询结果。哪个部门的ID=100?为什么不是101

以下查询:

SELECT json_value(department_data format json, '$.department_list.value'  ) 
FROM departments_json JS 
WHERE DEPARTMENT_ID=100;
SELECT json_value(department_data format json, '$.department_list.value'  ) 
FROM departments_json JS 
WHERE DEPARTMENT_ID=101;
SELECT *
FROM   departments_json
WHERE JSON_value(department_data format json, '$.department_list.value') = ('məharaːʂʈrə');

SELECT *
FROM   departments_json
WHERE JSON_TEXTCONTAINS(department_data,  '$.department_list.value', 'məharaːʂʈrə')
下面的查询显示了哪个字符是多字节的:

select c, length(c), lengthb(c) 
from ( select substr(s, level, 1) c 
       from ( select 'məharaːʂʈrə' s 
              from dual) 
       connect by level <= length(s));

嗨@AkshayTrivedi,对我来说是这样的:从最后3个查询的末尾,第一个查询…JSON_值。。。返回第100行和第101行,第二个查询…JSON_TEXTCONTAINS。。。返回一个errorORA-40467:JSON_TEXTCONTAINS在没有启用JSON的上下文索引的情况下无法计算,所以我不理解这个问题?第一个查询只向您返回一行?@VBokšić,对不起,我没有提到下面的索引创建片段,索引是必需的:在部门上创建索引deptj_ctx_ix_json department_data indextype为ctxsys.context参数“section group ctxsys.json_section_group sync on commit”@VBokšić,用于查询1-…JSON_值。。请让我知道您环境中的字符集:从v$nls_参数中选择*参数,其中的参数类似于“%CHARACTERSET”;我已经添加了索引。现在,两个查询都返回两行。我正在测试这个。您可以在My Session>>下检查NLs参数NLSIt与like运算符一起工作:从部门json中选择*其中json_valuedepartment_数据格式json,“$.department_list.value”如“%məharaːʂʈrə%”;