sql >> データベース >  >> RDS >> Oracle

文字列間の類似性を返すOracle関数

    質問を読み直した後、あなたが本当に望んでいたものは次のとおりです。

    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
    

    基本的に、これはpl / sqlで行うことです。長さが増加するサブストリングを作成し、それらが一致しなくなった時点で停止します。



    1. 1つのクエリで2つのテーブルから行を削除する

    2. android/phpレコードがmysqlに挿入されていません

    3. サブクエリJOINでの外部クエリへの参照

    4. 大きなxmlから抽出すると、文字列リテラルが長すぎてクエリが失敗します