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性能线程采用。