2011-04-17 51 views
1

是否有一个简单而优雅的方法来返回Oracle中两个无序的分隔列表之间的区别?两个无序的删除列表之间的区别(Oracle)

实施例:

  • 列表A:A1,B4,G3,H6,T8,A0
  • 列表B:B4,H6,A0,T8,A1

差异:G3

+2

归它,你可以使用[负](HTTP:// WWW。 orafaq.com/wiki/Minus) – 2011-04-17 05:41:53

+1

当你说“两个分隔列表”时,你的意思是两个字符串? – Gabe 2011-04-17 05:57:35

+0

对不起加贝 - 是两个字符串,所以“a1,b4,g3,h6,t8,a0”和“b4,h6,a0,t8,a1” – Darren 2011-04-17 10:13:54

回答

3

如果您有权访问APEX_UTIL,则可以将字符串解析为数组,然后将其转换为集合,然后使用MULTISET EXCEPT(与MINUS相同,但是用于集合):

SET SERVEROUT ON 
DECLARE 
    TYPE set_t IS TABLE OF varchar2(100); 
    listA APEX_APPLICATION_GLOBAL.vc_arr2; 
    listB APEX_APPLICATION_GLOBAL.vc_arr2; 
    excpt set_t; 
    FUNCTION to_set_t (arr IN APEX_APPLICATION_GLOBAL.vc_arr2) 
    RETURN set_t IS 
    rset set_t := set_t(); 
    BEGIN 
    rset.EXTEND(arr.COUNT); 
    FOR i IN 1..arr.COUNT LOOP 
     rset(i) := TRIM(arr(i)); 
    END LOOP; 
    RETURN rset; 
    END; 
BEGIN 
    -- parse lists into arrays 
    listA := APEX_UTIL.string_to_table('a1, b4, g3, h6, t8, a0',','); 
    listB := APEX_UTIL.string_to_table('b4, h6, a0, t8, a1',','); 
    -- convert arrays to collections, then do the minus 
    excpt := to_set_t(listA) MULTISET EXCEPT to_set_t(listB); 
    -- display the results 
    FOR i IN 1..excpt.COUNT LOOP 
    DBMS_OUTPUT.put_line(excpt(i)); 
    END LOOP; 
END; 

结果:在MULTISET运营商,这是在10g中引入

g3 

更多信息:http://www.oracle-developer.net/display.php?id=303