2017-10-05 63 views
1

我希望有一個大腦可以幫助迷失的靈魂;Oracle - 在Word中搜索Word

我有兩列; COL_ACOL_B,兩列的每條記錄只包含一個單詞(單詞的長度可能不同)。

我試圖做的是搜索COL_A和識別的部分(詞)匹配COL_B,例如,COL_A = 'MSOFT'COL_B = 'MICROSOFT'因此這將被列爲比賽。

同樣,如果COL_A = 'RANGE'COL_B = 'ORANGE'這也將被分類爲匹配。

但是,如果COL_A = 'ORGAN'COL_B = 'ORANGE'這不會被分類爲匹配。

我接受建議(純SQL,函數等)。

一如既往,任何幫助將不勝感激。

非常感謝提前!

+0

目前仍不清楚你的意思是一場比賽。所以如果col_A ='RANGE'和col_B ='ORANGE'是一個匹配項;如果col_A ='ORANGE'和col_B ='RANGE',它仍然是一個匹配嗎?這是否是另一個的子詞呢?那麼:這兩個詞之間的區別必須是一個連續的子字符串(如在所有例子中),還是'ALMA'匹配'K ** AL ** I ** M ** ER ** A **'? – mathguy

+0

您好,Mathguy,對於模棱兩可道歉, COL_A將始終包含少於或相同數量的字符作爲COL_B。關於字符串; OK,這將是一個連續的子字符串(因此'ALMA'和'KALIMERA'不會被視爲匹配。非常感謝。 – MAndrews

+0

OK,所以匹配意味着第一行是初始子字符串,最後一個子字符串最後一個),或者初始子字符串和最後一個子字符串的連接?任何其他情況意味着「差異」不是連續的。請確認。然後:有趣的問題!不確定它在現實生活中的真正適用性,但這是一個很好的挑戰(因爲有很多方法可以匹配,所以非常簡單) – mathguy

回答

0

事情是這樣的..這會爲你的樣本數據

SELECT * 
    FROM yourtable 
WHERE INSTR(col_a,col_b,1)>0 
    OR INSTR(col_b,col_a,1)>0 
    or INSTR(substr(col_a,2,length(col_a)), col_b,1)>0 
    or INSTR(substr(col_b,2,length(col_b)), col_a,1)>0 
0

一個簡單like條件應該做的伎倆:

SELECT * 
FROM mytable 
WHERE col_a LIKE '%' || col_b || '%' 
+0

感謝Mureinik的迅速反應。我曾嘗試使用上述內容,但不幸的是,它似乎並未滿足我的要求。我認爲(而且我可能是錯的),但根據我的測試,這隻適用於整個單詞而不是部分單詞(例如,如果COL_A ='SOFT'和COL_B ='MICROSOFT'則匹配,但如果COL_A ='則不匹配MSOFT')。而我需要'MSOFT'作爲匹配。 – MAndrews

+0

另請參閱我對OP的評論 - 是否錯過了某些內容,或者您​​是否僅僅通過此解決方案猜測完整需求? – mathguy

1

在這裏的工作就是要解決這個簡單的方法。這並不美觀,而且可能效率不高(但問題本身可能沒有非常有效的解決方案,就其性質而言)。儘管如此,閱讀,理解和維護應該很容易。

我假設col_a中的NULL被視爲「空字符串」,因此無論col_b中的內容如何,​​它都與col_b匹配。如果您想將其視爲實際的NULL,則可以在MATCH列中返回'N'或者更好的NULL值。

with 
    inputs (col_a, col_b) as (
     select 'MSOFT', 'MICROSOFT' from dual union all 
     select 'RANGE', 'ORANGE' from dual union all 
     select 'BLUES', 'BLUES'  from dual union all 
     select 'ORGAN', 'ORANGE' from dual union all 
     select 'ALMA' , 'KALIMERA' from dual union all 
     select null , 'OCTOPUS' from dual union all 
     select 'ALPHA', 'ALPHABET' from dual 
    ) 
-- End of simulated inputs (for testing only, not part of the solution). 
-- SQL query begins BELOW THIS LINE. Use your actual table and column names. 
select col_a, col_b, 
     case when col_a is null then 'Y' 
      when exists (select level from dual 
          where col_a = substr(col_b, 1, level - 1) || 
              substr(col_b, -(length(col_a) - level + 1), 
                  length(col_a) - level + 1) 
          connect by level <= length(col_a) + 1 
         ) 
           then 'Y' 
           else 'N' end as match 
from inputs; 

COL_A COL_B  M 
----- --------- - 
MSOFT MICROSOFT Y 
RANGE ORANGE Y 
BLUES BLUES  Y 
ORGAN ORANGE N 
ALMA KALIMERA N 
     OCTOPUS Y 
ALPHA ALPHABET Y 
+0

謝謝,Mathguy - 這看起來好像能完成這項工作。真棒!你是個明星! – MAndrews