2013-10-16 28 views
0

我使用Oracle DB。我有兩個字段AB。 我必須檢索那些行,其中A<>B。 問題是A可能是'12|14|15'B可能是'12|15|14'。 所以,他們實際上是一樣的,只是數字的順序是不同的。 如何檢索字段實際上不相等的行 ,如'30|31|14''31|30|15''22|23''22'在oracle中分割字符串和比較字段

請提出解決方案。

+0

爲什麼downvote? –

+0

可能是因爲工具提示@ A.B.Cade(不是我):_「這個問題沒有顯示任何研究工作」_ – Ben

回答

2

解決方案是規範化您的表。其他解決方案都很複雜且效率低下。

做適當的標準方法是使用分層查詢或流水線表函數將值拆分爲列(即規範化它們),然後比較這種方式,但如果你有一定數量的管道,那麼你應該能夠使用標準的SUBSTR()INSTR()函數在管道上進行分割並進行比較。

上你要搜索,並且在字符串的結尾串聯管道把它分解爲每下面,然後搜索你要找的第二個字符串中的字符串:

with the_string as (
select '|' || '12|14|15' || '|' as str1 
     , '|' || '12|15|14' || '|' as str2 
    from dual 
     ) 
select substr(str1, instr(str1, '|', 1, 1), instr(str1, '|', 1, 2)) 
    , substr(str1, instr(str1, '|', 1, 2), instr(str1, '|', 1, 3) - instr(str1, '|', 1, 2) + 1) 
    , substr(str1, instr(str1, '|', 1, 3), instr(str1, '|', 1, 4) - instr(str1, '|', 1, 3) + 1) 
    from the_string 
where str2 like '%' || substr(str1, instr(str1, '|', 1, 1), instr(str1, '|', 1, 2)) || '%' 
    and str2 like '%' || substr(str1, instr(str1, '|', 1, 2), instr(str1, '|', 1, 3) - instr(str1, '|', 1, 2) + 1) || '%' 
    and str2 like '%' || substr(str1, instr(str1, '|', 1, 3), instr(str1, '|', 1, 4) - instr(str1, '|', 1, 3) + 1) || '%' 

當字符串長度相同但內容不同時,由於內容不同,因此不會返回任何內容,因此當字符串長度不同時,將不返回任何內容,因爲返回的「值」中的一個將爲NULL,並且不能直接比較空值。

SQL Fiddle

正如我說的,規範的數據庫,但...要簡單得多。

+0

謝謝!但是,如果所有行中的管道數不相同,是不是可能? – user1097217

+0

只要您知道任何行@ user1097217中的最大管道數,就有可能。 – Ben

2

這可能不是最好的解決方案,但恕我直言,這是更有趣然後拆分記錄,然後再重聚集他們

with xslt as 
(select xmltype('<?xml version="1.0"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
     <xsl:template match="/"><xsl:for-each select="//b"> 
     <xsl:sort select="."/><xsl:value-of select="."/> 
</xsl:for-each></xsl:template></xsl:stylesheet>') xsl from dual) 

select t.* 
from t, xslt 
where xmltype('<r><b>'||replace(a, '|', '</b><b>')||'</b></r>').transform(xsl).getstringval() <> 
xmltype('<r><b>'||replace(b, '|', '</b><b>')||'</b></r>').transform(xsl).getstringval() 

Here is a sqlfiddle demo

+0

謝謝你的迴應。但是,請你稍微解釋一下。 – user1097217

+0

首先,我通過用''(並連接開始和結束標記)代替'|'來創建一個xml,然後我使用xsl變換隻獲取值,但是排序(所以'14 | 15'將會是'1415'和'15 | 14'也將是'1415') –

+0

我最初的想法是使用'XMLDIFF'來檢查2個字符串是否相同或不相等,但是它顯然是指順序至... –