clob上同一列的多个条件

时间:2016-05-16 20:48:10

标签: sql oracle

如何根据同一列中的多个值选择行。 我想选择同时包含Apple和Orange的所有行ID e.g。

T1

ID    Value
1     Apple
1     Orange
2     Apple
2     Kiwi
3     Pear
3     Berry
3     Orange
4     Apple
5     Apple
5     Orange
5     Kiwi

所以这是我的输出:

1  
5

如何在“值”列上执行AND。此外,“值”列是clob类型。

1 个答案:

答案 0 :(得分:0)

这样可行,但由于它扫描整个表两次,因此有点浪费。 “交叉”部分也不算太糟糕,因为它只在id的结果集上。

select id from t1 where dbms_lob.compare(value, to_clob('Apple'))  = 0
intersect
select id from t1 where dbms_lob.compare(value, to_clob('Orange')) = 0;

如果你需要更快的性能(如果你有很多行并且clobs很大),也许这会更快(只扫描整个表一次):

with x (id, a, o) as (
        select id, case dbms_lob.compare(value, to_clob('Apple'))  when 0 then 1 end,
                   case dbms_lob.compare(value, to_clob('Orange')) when 0 then 1 end
        from t1
     )
select   id 
from     x
group by id
having   count(a) > 0 and count(o) > 0;

这仍然有些浪费,因为即使第一个dbms_lob.compare()成功,也会执行第二个 <ldap-authentication-provider> <password-compare hash="{ssha}"/> </ldap-authentication-provider> 。如果您需要更快的性能,可以重写查询以避免这种重复。

像往常一样,您需要的性能越多,查询就越复杂。你需要决定两者之间的适当平衡。