在这里的工作就是要解决这个简单的方法。这并不美观,而且可能效率不高(但问题本身可能没有非常有效的解决方案,就其性质而言)。尽管如此,阅读,理解和维护应该很容易。
我假设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
目前仍不清楚你的意思是一场比赛。所以如果col_A ='RANGE'和col_B ='ORANGE'是一个匹配项;如果col_A ='ORANGE'和col_B ='RANGE',它仍然是一个匹配吗?这是否是另一个的子词呢?那么:这两个词之间的区别必须是一个连续的子字符串(如在所有例子中),还是'ALMA'匹配'K ** AL ** I ** M ** ER ** A **'? – mathguy
您好,Mathguy,对于模棱两可道歉, COL_A将始终包含少于或相同数量的字符作为COL_B。关于字符串; OK,这将是一个连续的子字符串(因此'ALMA'和'KALIMERA'不会被视为匹配。非常感谢。 – MAndrews
OK,所以匹配意味着第一行是初始子字符串,最后一个子字符串最后一个),或者初始子字符串和最后一个子字符串的连接?任何其他情况意味着“差异”不是连续的。请确认。然后:有趣的问题!不确定它在现实生活中的真正适用性,但这是一个很好的挑战(因为有很多方法可以匹配,所以非常简单) – mathguy