Sql 用CLOB查询
我有一个CLOB类型的“PHOTOIDS”列,它有一个逗号分隔的数字列表。我需要查询所有记录,其中包含一组特定的“photoid”。查询CLOB列中的数字列表的最佳方式是什么 我在寻找语义上类似于 从(1,2,3)中PhotoID所在的表_名称中选择*Sql 用CLOB查询,sql,oracle,plsql,rdbms,Sql,Oracle,Plsql,Rdbms,我有一个CLOB类型的“PHOTOIDS”列,它有一个逗号分隔的数字列表。我需要查询所有记录,其中包含一组特定的“photoid”。查询CLOB列中的数字列表的最佳方式是什么 我在寻找语义上类似于 从(1,2,3)中PhotoID所在的表_名称中选择* 只要您有一个相对有限的要搜索的数字列表,这就行了:)我建议您规范化您的设计,并有一个子表来保存photoid。这样会更高效、更简单 如果你不能做到这一点,那么使用过程/函数或动态sql就可以了,如果你想了解更多关于如何使用这两种方法的信息,请告诉
只要您有一个相对有限的要搜索的数字列表,这就行了:)我建议您规范化您的设计,并有一个子表来保存photoid。这样会更高效、更简单
如果你不能做到这一点,那么使用过程/函数或动态sql就可以了,如果你想了解更多关于如何使用这两种方法的信息,请告诉我。如果不是CLOB列,而是正确的规范化设计,你可以用几种方法来看这个问题:“有限的数字列表”因为“1”将匹配“10”和“11”以及“111”,并且。。。。好吧,不必再赘述了。我的意思是有限的数字数量,例如,如果你对照100个不同ID的列表进行检查,那么它将是无效的。您注意到的问题(1匹配10和11以及111)可以根据数据在clob中的存储方式来解决。如果ID用逗号分隔,那么您可以简单地将条件“dbms_lob.instr(photoids,'1')>0”作为示例。我刚刚将@Skynet指向了正确的函数(dbms_lob.instr),那么“1”将匹配“11”和“21”,等等。我想你明白我的意思了。假设我们要搜索ID为1的实例,那么我们将使用(dbms_lob.instr(photoids',1',)>0或dbms_lob.instr(photoids,'1',)=1)。该子句的前半部分将在光照像场的中间寻找ID 1的出现,而第二部分将从1开始寻找光敏体块。正如我所说,这实际上取决于clob中数据的结构,我的目标是简单地将@Skynet指向正确的函数:)
SELECT *
FROM table_name
WHERE dbms_lob.instr(photoids, '1') > 0
AND dbms_lob.instr(photoids, '2') > 0
AND dmbs_lob.instr(photoids, '3') > 0;