2011-06-09 5 views
7

Tengo una base de datos con una tabla de secuencia. Cada secuencia (aminoácido) en esta tabla comprende 20 caracteres diferentes (A, V, ...). Por ejemplo, "MQSHAMQCASQALDLYD ...".Contando caracteres en secuencias a través de SQL

Me gustaría contar el número de apariencias de cada char, para obtener algo como "2xM, 3xQ, ...".

Además, me gustaría hacer esto sobre todas las secuencias en mi DB, así que obtengo la apariencia general de cada char. ("248xM, 71x W, ...").

¿Cómo puedo hacer esto en PostgreSQL? Por el momento, lo estoy haciendo con Ruby, pero tengo 25,000 secuencias con una longitud de 400 caracteres cada una. Esto lleva un tiempo y espero que sea más rápido con SQL.

Respuesta

7

Esto es cómo encontrar todas las a en una cadena:

select length(regexp_replace('AAADDD', '[^A]', '', 'g')); 

Esto es cómo encontrar todos los A en una tabla:

select sum(length(regexp_replace(field, '[^A]', '', 'g'))) from table; 
5

Por lo general encontramos que define una función reutilizable más flexible:

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

Y entonces usted puede utilizarlo como:

SELECT sum(numch('A', colname)) AS nA, sum(numch('V', colname)) AS nV 
    FROM relname; 

Para obtener resultados como:

na | nv 
--------+-------- 
359541 | 296330 
(1 row) 

Adaptado de this hilo psql rendimiento.

Cuestiones relacionadas