关于postgresql:通过SQL按顺序计算字符数

Counting chars in sequences via SQL

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

我想计算每个字符的出现次数,以便得到类似" 2xM,3xQ,..."的信息。

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

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


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

1
SELECT LENGTH(regexp_replace('AAADDD', '[^A]', '', 'g'));

这是查找表中所有A的方法:

1
SELECT SUM(LENGTH(regexp_replace(FIELD, '[^A]', '', 'g'))) FROM TABLE;

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

1
2
3
4
CREATE OR REPLACE FUNCTION numch(text, text) RETURNS INTEGER AS
  $$
    SELECT LENGTH($2) - LENGTH(REPLACE($2, $1, ''))
  $$ LANGUAGE SQL;

然后您可以像这样使用它:

1
2
SELECT SUM(numch('A', colname)) AS nA, SUM(numch('V', colname)) AS nV
  FROM relname;

要获得如下结果:

1
2
3
4
   na   |   nv  
--------+--------
 359541 | 296330
(1 ROW)

从此psql性能线程采用。