2015-05-19 12 views
7
=# select row(0, 1) ; 
    row 
------- 
(0,1) 
(1 row) 

Come ottenere 0 all'interno della stessa query? Ho capito che funziona sotto, ma esiste un modo semplice?Come ottenere il primo campo da un tipo di riga anonima in PostgreSQL 9.4?

=# select json_agg(row(0, 1))->0->'f1' ; 
?column? 
---------- 
0 
(1 row) 

Non c'è fortuna con la sintassi di tipo array [0].

Grazie!

+2

Il costruttore 'row' produce un record * * anonima. Puoi (ab) usare 'row_to_json' per lo scopo. Non è possibile indicizzarli con operatori di array perché non sono matrici. I campi possono essere diversi per tipo. In realtà, il supporto di PostgreSQL per i record anonimi è limitato e non è generalmente una buona idea affidarsi a loro. –

risposta

0

Il tipo di riga è anonimo e pertanto non è possibile accedere facilmente ai relativi elementi. Che cosa si può fare è creare un TYPE e poi gettato la riga anonimo a quel tipo e accedere agli elementi definiti nel tipo:

CREATE TYPE my_row AS (
    x integer, 
    y integer 
); 

SELECT (row(0,1)::my_row).x; 

come Craig Ringer ha commentato nella sua interrogazione, si dovrebbe evitare di produrre le righe anonime per cominciare , se puoi aiutarlo e digita tutti i dati che usi nel tuo modello dati e nelle tue query.

0

La soluzione JSON è molto elegante. Solo per divertimento, questa è una soluzione che utilizza regexp (molto più brutto):

WITH r AS (SELECT row('quotes, "commas", 
and a line break".',null,null,'"fourth,field"')::text AS r) 
--WITH r AS (SELECT row('',null,null,'')::text AS r) 
--WITH r AS (SELECT row(0,1)::text AS r) 
SELECT CASE WHEN r.r ~ '^\("",' THEN '' 
      WHEN r.r ~ '^\("' THEN regexp_replace(regexp_replace(regexp_replace(right(r.r, -2), '""', '\"', 'g'), '([^\\])",.*', '\1'), '\\"', '"', 'g') 
      ELSE (regexp_matches(right(r.r, -1), '^[^,]*'))[1] END 
FROM r 

Durante la conversione di una riga di testo, PostgreSQL usa la formattazione CSV citato. Non sono riuscito a trovare alcuno strumento per importare CSV tra virgolette in un array, quindi quanto sopra è una manipolazione di testo grezza tramite espressioni prevalentemente regolari. Forse qualcuno lo troverà utile!

0

Se si desidera solo il primo elemento da ogni riga, convertire la fila per JSON e selezionare f1 ...

Oppure, se si sta andando sempre di avere due numeri interi o una struttura rigorosa, si può creare una tabella temporanea (o tipo) e una funzione che seleziona la prima colonna.

CREATE TABLE tmptable(f1 int, f2 int); 
CREATE FUNCTION gettmpf1(tmptable) RETURNS int AS 'SELECT $1.f1' LANGUAGE SQL; 

SELECT gettmpf1(ROW(0,1)); 

Risorse:

https://www.postgresql.org/docs/9.2/static/functions-json.html https://www.postgresql.org/docs/9.2/static/sql-expressions.html

Problemi correlati