sql >> Database >  >> RDS >> Oracle

Oracle-functie om overeenkomst tussen strings te retourneren

Na het herlezen van uw vraag, zou dit zijn wat u echt wilde:

with cte1 as  (
    select 1 id, 'abc def hijk www' str from dual
    union all
    select 2 id, 'abc def iosk www' str from dual
), num_gen as (
    -- a number generator up to the minimum length of the strings
    SELECT level num
    FROM dual t
    CONNECT BY level <= (select min(length(str)) from cte1)
), cte2 as (
    -- build substrings of increasing length
    select id, num_gen.num, substr(cte1.str, 1, num_gen.num) sub
    from cte1
    cross join num_gen
), cte3 as (
    -- self join to check if the substrings are equal
    select x1.num, x1.sub sub1, x2.sub sub2
    from cte2 x1
    join cte2 x2 on (x1.num = x2.num and x1.id != x2.id)
), cte4 as (
    -- select maximum string length
    select max(num) max_num
    from cte3
    where sub1 = sub2
)
    -- finally, get the substring with the max length
    select cte3.sub1
    from cte3
    join cte4 on (cte4.max_num = cte3.num)
    where rownum = 1

In wezen is dit wat je zou doen in pl/sql:bouw substrings van toenemende lengte en stop op het punt waarop ze niet meer overeenkomen.



  1. MySQL Ongeldige standaardwaarde voor tijdstempel als er geen standaardwaarde is opgegeven.

  2. Meerdere tabellen samenvoegen om NIET GELIJKE waarden te krijgen in MySQL

  3. Waarom zie ik dat COLLATIE 'xxx' niet geldig is voor KARAKTERSET 'yyy'

  4. HikariCP - verbinding is niet beschikbaar