2012-06-05 17 views
5

Ha pasado un tiempo desde que tuve que hacer cualquier trabajo de DB, así que no estoy seguro de cómo preguntar esto y sé que lo hice en el pasado.
¿Cómo se crea una tabla temporal de una lista de cadenas (sin utilizar CREATE TEMPORARY TABLE)? Por lo tanto, si usted tiene algo así como:PostgreSQL: ¿Cómo buscar una lista de cadenas como una tabla?

  • '1', 'a', 'A'
    '2', 'B', 'B'
    '3', 'c' , 'C'

  • SELECT field2 
    FROM { {'1','a','A'}, {'2','b','B'}, {'3','c','C'} } 
         AS fooarray(field1,field2,field3) 
    WHERE field1 = '2' 
    -- should return 'b' 
    

pista: es similar a ...

  • SELECT * FROM unnest(array[...]); 
    
+0

¿Qué hay de malo con el uso de 'unnest' –

+0

Para 1, no está funcionando muy bien con matrices multidimensionales. Pero digamos que tengo una matriz unidimensional, todavía estoy luchando para unirme a una tabla existente 'seleccionar más abajo (letra) de (seleccionar * de unnest ('{" A "," B "," C " } ') como letra) como foo donde inferior (letra) no está en (seleccione inferior (letra) de otra parte); ' – vol7ron

+0

Actualización: Así que no sé cuál fue el problema de unión, pero se está uniendo bien ahora. Aún así, las múltiples dimensiones son un problema. Quería usar solo funciones nativas y evitar usar cualquier tipo de proceso almacenado para desenredar las dimensiones. - Los 'valores' de mu son lo que estaba buscando, y probablemente lo que hice en el pasado – vol7ron

Respuesta

10

No es necesario perder el tiempo con matrices en absoluto, se puede construir la tabla en su lugar usando VALUES:

7,7. VALORES Listas

VALUES proporciona una forma de generar una "tabla constante" que se puede utilizar en una consulta sin tener que realmente crear y completar una tabla en el disco.

Véase también VALUES.

Así que usted puede hacer cosas como esta:

=> select * 
    from (
     values ('1', 'a', 'A'), 
       ('2', 'b', 'B'), 
       ('3', 'c', 'C') 
    ) as t(id, c1, c2) 
    where id = '2'; 

id | c1 | c2 
----+----+---- 
2 | b | B 
(1 row) 

No se olvide de dar a sus valores un alias completa con los nombres de columna (t(id, c1, c2)) para que todo tenga un nombre.

+0

Por alguna razón, pensé que estaba usando la sintaxis' {{}, {}} ', pero luego recordé que usé valores como bien. De cualquier manera, esto es lo que necesitaba. ¿Debería también especificar los tipos de datos en el alias (por ejemplo, 't (id :: numérico, c1 :: texto, c2 :: texto)')? – vol7ron

+0

@ vol7ron: AFAIK tendrías que especificar los tipos de datos dentro de cada uno de los VALORES, aunque probablemente no los necesites, los tipos deberían inferirse muy bien. –

Cuestiones relacionadas