2012-06-26 10 views
9

La siguiente consulta:de consulta en el valor de elementos de matriz (PostgreSQL)

select unnest(Table2.L) as X, unnest(Table1.O) 
from Table1, Table2 
where Table1.code = Table2.code 
order by X ; 

produce los resultados deseados. Me gustaría, sin embargo, excluir filas (no alineadas) que coincidan con algún valor. Agregar una condición a la consulta, como la siguiente:

and unnest(Table2.L) != '-' 

obviamente no funciona. es posible? ¿Cómo?

Respuesta

7

Si por unnest(Table2.L) != '-' quiere decir

tirar todos los elementos no anidados que son '-'

a continuación, utilizar una tabla derivada y filtrar los valores no anidados que no quiere:

select * 
from (
    select unnest(Table2.L) as X, unnest(Table1.O) 
    from Table1 join Table2 on Table1.code = Table2.code 
) dt 
where X != '-' 
order by X ; 

Si se refiere a

ignoran todas las filas de Table2 donde L contiene '-'

continuación, puede utilizar la @> operator para comprobar si L contiene un cierto elemento:

select unnest(Table2.L) as X, unnest(Table1.O) 
from Table1 join Table2 on Table1.code = Table2.code 
where not Table1.L @> ARRAY['-'] 

o puede utilizar ANY:

select unnest(Table2.L) as X, unnest(Table1.O) 
from Table1 join Table2 on Table1.code = Table2.code 
where not '-' = any(Table1.L) 

Y hágalo usted mismo un favor al olvidar que existen uniones implícitas, siempre use condiciones explícitas de unión.

+0

que significaba el primer escenario en su respuesta, pero gracias por la información adicional también. – SabreWolfy

2

Otra forma de hacerlo:

SELECT x, y 
FROM (SELECT code, unnest(l) AS x FROM table1) t1 
JOIN (SELECT code, unnest(o) AS y FROM table2) t2 USING (code) 
WHERE x <> '-' 
ORDER BY x; 

mayo de puede no ser más rápido. Depende de qué tan selectiva sea la cláusula WHERE. Ejecute un rápido EXPLAIN ANYLYZE.

Tenga en cuenta que he desenredado table1 y table2, que se invierten en el ejemplo. Si está confundido por la claridad, intente sustituir x ->y en la cláusula WHERE y ORDER BY.

Si realmente desea eliminar ocurrencias de - en ambos lados, añadir AND y <> '-' a la cláusula WHERE - hacer (posible sin cuonfusion) es simétrica.
También lo haría ORDER BY x, y, si no se garantiza que x sea único, para que el orden de clasificación sea estable.

Demo on sqlfiddle.

+0

Hay ~ 350 filas que coinciden después de excluir las filas ''-''. Tu respuesta da ~ 34000, entonces algo está mal en alguna parte :) Lo estoy verificando ahora. Además, pude incluir columnas adicionales de 'Table2' en la consulta que dice" mu too too short ", pero no puedo hacerlo con tu respuesta. – SabreWolfy

+0

Debe haber algún tipo de malentendido. Agregué un poco a mi respuesta para aclarar. –

Cuestiones relacionadas