Oracle SQL:选择查询:搜索clob是否包含模式匹配的字符串

Oracle SQL:选择查询:搜索clob是否包含模式匹配的字符串,sql,oracle,Sql,Oracle,我有一个Orable表,其中有一个包含JSON数据的CLOB列。我需要一个将在CLOB数据中搜索的查询 我使用了条件,其中DBMS_LOB.instr(colName,'apple:')>0,它给出了具有apple:的记录。但是,我需要查询以返回除空白以外的任意数量的苹果记录,这意味着jsonapple键应该有一个值 我想到了类似于的东西,其中DBMS_LOB.instr(colName,'apple:*X**')>0,其中X可以是任何不为空的数字。我尝试了regexp\u instr,但这似乎

我有一个Orable表,其中有一个包含JSON数据的CLOB列。我需要一个将在CLOB数据中搜索的查询

我使用了条件
,其中DBMS_LOB.instr(colName,'apple:')>0
,它给出了具有
apple:
的记录。但是,我需要查询以返回除空白以外的任意数量的苹果记录,这意味着json
apple
键应该有一个值

我想到了类似于
的东西,其中DBMS_LOB.instr(colName,'apple:*X**')>0
,其中
X
可以是任何不为空的数字。我尝试了
regexp\u instr
,但这似乎不适合CLOB


是否有其他方法可以解决此问题?

您可以使用类似regexp\u的函数来解决此问题:
在类似regexp_(colName,'apple:[0-9]')

的地方,解析JSON输入的通用字符串函数是危险的——例如,当看起来像JSON对象的东西实际上嵌入到字符串值中时,就会出现误报。(在下面的示例中,ID=101说明了这一点。)

理想的情况是使用Oracle 19或更高版本;在这种情况下,您可以使用一个简单的调用
json\u exists
,如下所示。在我创建的示例表中,第一个JSON字符串不包含名为
apple
的成员。在第二行中,字符串确实包含一个成员
apple
,但值为
null
。我显示的第一个查询(查找带有
apple
成员的所有JSON)将在输出中包含这一行。最后一个查询是您需要的:它添加了一个过滤器,以便JSON字符串必须至少包含一个具有非
null
值的
apple
成员(不管它是否还包括名为
apple
的其他成员,可能具有
null
值)

请注意,我有意将带引号和不带引号的成员名称混合在一起,以验证下面的查询在所有情况下都能正确工作。(还请记住,JSON中的成员名称区分大小写,即使在Oracle中也是如此!)

这是您需要的查询。注意路径中的
(意思是在JSON中的任意位置找到名为
apple
的对象成员)和末尾的过滤器

select id
from   sample_data
where  json_exists(colname, '$..apple?(@ != null)')
;

 ID
---
103

这是关系数据库的一个错误。在数据库中存储json数据是很好的,但是如果您需要能够在该json数据中搜索,您还应该在插入/更新时提取您关心的字段,并为它们提供自己的真实列。oracle内置了对查询json的支持。请仔细阅读。。。从Oracle 12.1开始,并在以后的版本中进行了改进。如果您在Oracle数据库中存储JSON,必须告诉我们您的Oracle版本。较新的版本对JSON有很强的支持,而较旧的版本(高达11.2)则不支持。它将跳过与
{apple:10}
相同的
{apple:10}
,并将为
{“someKey”:“apple:1}
返回正值false。如果JSON处理器已经存在,则无需重新设计它。使用JSON.regexp_,我会收到一个错误,说明函数不可用。
select id
from   sample_data
where  json_exists(colname, '$..apple')
;


 ID
---
102
103
select id
from   sample_data
where  json_exists(colname, '$..apple?(@ != null)')
;

 ID
---
103