通过SQL计算序列中的字符数

Bjo*_*sen 8 postgresql count

我有一个带序列表的数据库.该表中的每个(氨基酸)序列包含20个不同的字符(A,V,......).例如"MQSHAMQCASQALDLYD ......".

我想计算每个char的外观数量,这样我得到的东西就像"2xM,3xQ,......".

此外,我想在我的数据库中的所有序列上执行此操作,因此我得到每个字符的整体外观.("248xM,71x W,......").

我怎么能在PostgreSQL中做到这一点?目前,我正在使用Ruby,但我有25,000个序列,每个序列长度约为400个字符.这需要一段时间,我希望SQL会更快.

Dmi*_*oda 8

这是如何在字符串中查找所有A:

select length(regexp_replace('AAADDD', '[^A]', '', 'g'));
Run Code Online (Sandbox Code Playgroud)

这是如何找到表中的所有A:

select sum(length(regexp_replace(field, '[^A]', '', 'g'))) from table;
Run Code Online (Sandbox Code Playgroud)


Ami*_*ari 6

我经常发现定义一个可重用的函数更灵活:

CREATE OR REPLACE FUNCTION numch(text, text) RETURNS integer AS
  $$ 
    SELECT length($2) - length(replace($2, $1, '')) 
  $$ LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)

然后你可以使用它:

SELECT sum(numch('A', colname)) AS nA, sum(numch('V', colname)) AS nV
  FROM relname;
Run Code Online (Sandbox Code Playgroud)

获得如下结果:

   na   |   nv   
--------+--------
 359541 | 296330
(1 row)
Run Code Online (Sandbox Code Playgroud)

这个 psql性能线程采用.