我有两个长字符串(每个字符5684400个字符)。它们差不多相同:只有几个字符不同。
我需要找到那些角色。
PostgreSQL中最快的方法是什么?
答案 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)
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;
如果你需要这个一次性的东西,这可能已经足够了。但是对于很多字符串来说这不会很好。