2012-11-08 47 views
0

我想比較oracle表中的逗號分隔列和另一個表中的另一個逗號分隔列。如果第一列中的所有值(在逗號分隔的列中且與它們的順序無關)都包含在第二列中,則不應返回該行。在兩個不同的oracle表中比較兩個逗號分隔的列

例如 -

  1. 柱1具有,B,C,DEF 第2列具有,C,B

    這不應該被返回爲一個,c和b列2在列1中包含 ,而不管它們的順序如何。

  2. 柱1具有,CL,OWD 第2列具有,OWD,第

    該行應該被返回,因爲柱2具有 'PP' 列中包含這是不 1.

  3. 第1列VVV,CCC,RR 第2列具有CCC,RR

    這行不應該退還。

我可以在SQL中做到這一點嗎?不期待程序或功能。

感謝您的幫助!

+0

這些規則相當混亂,文本中的描述與示例不匹配。 – Andrew

+4

您不應該在第一個單獨的列中存儲逗號分隔值。如果您重新設計了您的數據模型(即解決根本原因),而不是打擊錯誤設計的症狀,那將會更好。 –

回答

2

第一:我認爲你的例子不符合你的問題。

但專注於您的問題:如果第一列中的所有值(在逗號分隔的列中且與它們的順序無關)都包含在第二列中,它不應該返回該行。

您需要的CSV解析爲一組(在regexp_substr部分),然後檢查是否從兩個列集完全包含一個列(minus部分)集:

SELECT * 
    FROM csv 
WHERE EXISTS 
     (SELECT REGEXP_SUBSTR (col1, '[^,]+', 1, ROWNUM) 
      FROM DUAL 
      CONNECT BY ROWNUM <= LENGTH (col1) - LENGTH (REPLACE (col1, ',')) + 1 
      MINUS 
      SELECT REGEXP_SUBSTR (col2, '[^,]+', 1, ROWNUM) 
      FROM DUAL 
      CONNECT BY ROWNUM <= LENGTH (col2) - LENGTH (REPLACE (col2, ',')) + 1 
     ) 
; 

http://www.sqlfiddle.com/#!4/3cdb3/1作爲例子。

相關問題