我想将oracle表中逗号分隔的列与另一个表中另一个逗号分隔的列进行比较。如果第一列中的所有值(在逗号分隔列中,不论其顺序如何)都包含在第二列中,则不应返回该行。
例如 -
第1列有a,b,c,def 第2列有a,c,b
这不应该作为a,包含第2列中的c和b返回 在第1栏内,无论其顺序如何。
第1列有一个,cl,owd 第2列有一个,owd,pp
应返回此行,因为第2列的“pp”不是 包含在第1栏中。
第1列有vvv,ccc,rr 第2列有ccc,rr
不应退回此行。
我可以在SQL中完成此操作吗?不期待程序或功能。
感谢所有帮助!!
答案 0 :(得分:2)
首先:我认为您的示例与您的问题不符。
但请专注于您的问题:如果第一列中的所有值(在逗号分隔列中,不论其顺序如何)都包含在第二列中,则不应返回该行。
您需要将csv解析为集合(regexp_substr
部分),然后检查第2列中的集合是否完全包含第1列中的集合(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。