2017-10-05 87 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