从string1和string2中查找不匹配的字符

时间:2017-08-22 13:30:49

标签: sql postgresql

我有两个长字符串(每个字符5684400个字符)。它们差不多相同:只有几个字符不同。

我需要找到那些角色。

PostgreSQL中最快的方法是什么?

2 个答案:

答案 0 :(得分:2)

这不是数据库服务器的任务。但是,如果您不想从远程服务器传输大量字符串,请安装一种可用的过程语言,例如Python

create or replace function diff_str(str1 text, str2 text)
returns setof text language plpython3u as $$
    res = []
    for i, c in enumerate(str1):
        if c != str2[i]:
            res += ('{}: {}->{}'.format(i+1, str1[i], str2[i]),)
    return res;
$$;

select * from diff_str('abcdefghijk', 'abcXefgYijk');

 diff_str 
----------
 4: d->X
 8: h->Y
(2 rows)

JavaScript (plv8)

create or replace function diff_str_v8(str1 text, str2 text)
returns setof text language plv8 as $$
    for (var i = 0; i < str1.length; i++)
        if (str1[i] != str2[i])
            plv8.return_next(i+1+ ': '+ str1[i]+ '->'+ str2[i]);
$$;

这些功能在1200万字符的字符串上进行了测试。 Plv8需要大约0.2秒,Python需要大约1.5秒。

答案 1 :(得分:1)

蛮力方法是替换所有匹配的cto将字符串转换为集合然后使用完整的外部联接并仅查找不同的那些。

E.g。要比较<script type="text/javascript"> function showDetails() { var e = document.getElementById("email"); //var t = document.getElementById("t"); var n = document.getElementById("name"); var m = document.getElementById("m"); var c = document.getElementById("email").value; // Here you set it the value = undefined variable var r = document.getElementById("name").value; document.getElementById("t").value = "Your name is: " + r + " and your email is: " + c; } </script> 'Hello, world',您可以使用

'Hello world.'

以上查询返回:

with s1(c) as (
  select * 
  from unnest(regexp_split_to_array('Hello, world', ''))
), s2 (c) as (
  select * 
  from unnest(regexp_split_to_array('Hello world.', ''))
)
select coalesce(s1.c, s2.c) as different
from s1
  full outer join s2 on s1.c = s2.c
where s1 is distinct from s2;

如果你需要这个一次性的东西,这可能已经足够了。但是对于很多字符串来说这不会很好。