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

MySqlの2つのほぼ同一の行/テーブル間のテキストの違いを比較します

    アプリケーションコードでこれを実現する方が簡単ですが、いくつかのMySQL関数を介して実現できます。

    delimiter //
    
    drop function if exists string_splitter //
    create function string_splitter(
      str text,
      delim varchar(25),
      pos tinyint) returns text
    begin
    return replace(substring_index(str, delim, pos), concat(substring_index(str, delim, pos - 1), delim), '');
    end //
    
    drop function if exists percentage_of_matches //
    
    create function percentage_of_matches(
      str1 text,
      str2 text)returns double
    begin
    set str1 = trim(str1);
    set str2 = trim(str2);
    while instr(str1, '  ') do
      set str1 = replace(str1, '  ', ' ');
    end while;
    while instr(str2, '  ') do
      set str2 = replace(str2, '  ', ' ');
    end while;
    set @i = 1;
    set @numWords = 1 + length(str1) - length(replace(str1, ' ', ''));
    set @numMatches = 0;
    while @i <= @numWords do
      set @word = string_splitter(str1, ' ', @i);
      if str2 = @word or str2 like concat(@word, ' %') or str2 like concat('% ', @word) or str2 like concat('% ', @word, ' %') then
        set @numMatches = @numMatches + 1;
      end if;
      set @i = @i + 1;
    end while;
    return (@numMatches / @numWords) * 100;
    end //
    
    delimiter ;
    

    最初の関数は2番目の関数で使用されます。これは、次のように、コードで呼び出したい関数です。

    select percentage_of_matches('salt water masala', 'salt masala water');
    select percentage_of_matches('water onion maggi milk', 'water onion maggi');
    



    1. PostgresBDR9.4.1を使用したDjango1.8の移行

    2. ORA-04091:表xx_xxが変更されています。トリガー/関数がそれを認識しない可能性があります

    3. MySQLはアルファベット順にソートしますが、無視します

    4. Mysql-動的SQLはトリガーで許可されていません