我有一个带序列表的数据库。该表中的每个(氨基酸)序列包含20个不同的字符(A,V,......)。例如“MQSHAMQCASQALDLYD ......”。
我想计算每个字符的出现次数,以便得到类似“2xM,3xQ,......”的内容。
此外,我想在我的数据库中的所有序列上执行此操作,因此我得到每个字符的整体外观。 (“248xM,71x W,......”)。
我如何在PostgreSQL中执行此操作?目前,我正在使用Ruby,但我有25,000个序列,每个序列长度约为400个字符。这需要一段时间,我希望SQL会更快。
答案 0 :(得分:7)
这是如何在字符串中找到所有A:
select length(regexp_replace('AAADDD', '[^A]', '', 'g'));
这是如何找到表格中的所有A:
select sum(length(regexp_replace(field, '[^A]', '', 'g'))) from table;
答案 1 :(得分:5)
我经常发现定义一个可重用的函数更灵活:
CREATE OR REPLACE FUNCTION numch(text, text) RETURNS integer AS
$$
SELECT length($2) - length(replace($2, $1, ''))
$$ LANGUAGE SQL;
然后您就可以使用它:
SELECT sum(numch('A', colname)) AS nA, sum(numch('V', colname)) AS nV
FROM relname;
获得如下结果:
na | nv
--------+--------
359541 | 296330
(1 row)
采用this psql-performance线程。