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

Wie erhalten Sie 0 innerhalb derselben Abfrage? Ich dachte mir, dass das unten funktioniert, aber gibt es einen einfachen Weg?Wie bekomme ich das erste Feld von einem anonymen Zeilentyp in PostgreSQL 9.4?

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

Kein Glück mit array-artiger Syntax [0].

Danke!

+2

Der 'row' Konstruktor erzeugt ein * anonymen Datensatz *. Sie können (ab) 'row_to_json' zu diesem Zweck verwenden. Sie können sie nicht mit Array-Operatoren indizieren, da sie keine Arrays sind. Die Felder können sich in ihrem Typ unterscheiden. Tatsächlich ist PostgreSQLs Unterstützung für anonyme Datensätze begrenzt, und es ist im Allgemeinen keine gute Idee, sich auf sie zu verlassen. –

Antwort

0

Ihr Zeilentyp ist anonym und daher können Sie nicht einfach auf seine Elemente zugreifen. Was können Sie tun, ist ein TYPE erstellen und dann auf diese Art Ihre anonyme Reihe gegossen und die Elemente in der Art definiert zuzugreifen:

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

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

Wie Craig Ringer in Ihrer Frage kommentiert, sollen Sie produzieren anonyme Reihen vermeiden beginnen Wenn Sie dazu beitragen können, geben Sie die Daten ein, die Sie in Ihrem Datenmodell und in Ihren Abfragen verwenden.

0

Die Json-Lösung ist sehr elegant. Just for fun, ist dies eine Lösung mit regexp (viel hässlichen):

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 

Wenn eine Zeile Umwandlung in Text, PostgreSQL verwendet zitierte CSV Formatierung. Ich konnte keine Werkzeuge finden, um CSV-Dateien in ein Array zu importieren, daher handelt es sich bei den oben genannten Methoden um grobe Textmanipulationen über meist reguläre Ausdrücke. Vielleicht findet jemand das nützlich!

0

Wenn Sie nur das erste Element aus jeder Zeile wollen, konvertieren Sie die Zeile zu JSON und wählen f1 ...

Oder, wenn Sie immer zwei ganzen Zahlen gehen oder eine strenge Struktur, die Sie haben, kann eine temporäre Tabelle (oder einen temporären Typ) und eine Funktion erstellen, die die erste Spalte auswählt.

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

SELECT gettmpf1(ROW(0,1)); 

Ressourcen:

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

Verwandte Themen