2012-06-05 11 views
5

E 'stato un po' che ho dovuto fare qualsiasi lavoro db, quindi non sono davvero sicuro di come chiedere questo e so che ho fatto in passato.
Come si fa a creare una tabella temporanea di una lista di stringhe (non utilizzare CREATE TEMPORARY TABLE)? Quindi, se avete qualcosa di simile:PostgreSQL: come cercare un elenco di stringhe come tabella?

  • '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' 
    

Suggerimento: E 'simile a ...

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

Cosa c'è di sbagliato con l'utilizzo di 'unnest' –

+0

Per 1, non funziona troppo bene con array multidimensionali. Ma diciamo che ho un array unidimensionale, sto ancora lottando per unirti a un tavolo esistente 'seleziona inferiore (lettera) da (seleziona * da non più ('{" A "," B "," C " } ') come lettera) come foo dove inferiore (lettera) non in (selezionare un valore inferiore (lettera) da someothertable); ' – vol7ron

+0

Aggiornamento: Quindi non so quale sia il problema unendo era, ma si unisce bene ora. Ancora le dimensioni multiple sono un po 'un problema. Volevo utilizzare solo le funzioni native ed evitare di utilizzare qualsiasi tipo di stored proc per rendere inutili le dimensioni. - 'values' di mu è quello che stavo cercando, e probabilmente quello che ho fatto in passato – vol7ron

risposta

10

Non è necessario pasticciare con gli array a tutti, è possibile costruire la tabella sul posto utilizzando VALUES:

7,7. VALORI Elenchi

fornisce un modo per generare una "tabella costante" che può essere utilizzata in una query senza dover effettivamente creare e popolare una tabella su disco.

Vedere anche VALUES.

modo da poter fare cose come questa:

=> 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) 

Non dimenticate di dare ai vostri VALORI un alias completo di nomi di colonna (t(id, c1, c2)) in modo che ogni cosa ha un nome.

+0

Per qualche ragione ho pensato che stavo usando il' {{}, {}} 'la sintassi, ma poi mi sono ricordato che ho usato come valori bene. Ad ogni modo, questo è quello di cui avevo bisogno. Dovresti specificare anche i tipi di dati sull'alias (ad esempio 't (id :: numeric, c1 :: text, c2 :: text)')? – vol7ron

+0

@ vol7ron: AFAIK dovresti specificare i tipi di dati all'interno di ciascuno dei VALORI, probabilmente non ne hai bisogno, i tipi dovrebbero essere dedotti bene. –

Problemi correlati