Sql Oracle数据库12c:Oracle JSON查询搜索
创建两种类型的表来存储JSON值BLOB和NCLOB,我的目标是从JSON表中搜索所需的值 代码片段1:创建一列为NCLOB的表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
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ə%”;