PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Sintassi corretta per array di tipo composito

I consigli finora non sono ottimali. C'è una soluzione più semplice e una spiegazione effettivamente applicabile.
In caso di dubbio, chiedi a Postgres di mostrartelo :

CREATE TEMP TABLE pencil_count (  -- table also registers row type
  pencil_color varchar(30)
, count integer
);

CREATE TEMP TABLE pencils (
  id serial
, pencils_ pencil_count[]
);

Inserisci 2 righe di base:

INSERT INTO pencil_count VALUES ('red', 1), ('blue', 2);

Consulta la sintassi per il tipo di riga di base :

SELECT p::text AS p_row FROM pencil_count p;

  p_row
----------
 (red,1)
 (blue,2)

Vedi la sintassi per un array di righe :

SELECT ARRAY(SELECT p FROM pencil_count p)::text AS p_row_arr;

       p_row_arr
------------------------
 {"(red,1)","(blue,2)"}

Tutto ciò che serve è racchiudere ogni letterale di riga tra virgolette doppie, il che è necessario solo per disabilitare il significato speciale della virgola all'interno di ogni tipo di riga.
Le virgolette doppie (con escape) sarebbero ridondanti mentre non ci sono caratteri speciali aggiuntivi.

Niente di tutto ciò ha a che fare con sintassi della stringa di escape , che è stato disattivato per impostazione predefinita da Postgres 9.1. Dovresti dichiarare esplicitamente la sintassi della stringa di escape anteponendo E , come E'string\n' . Ma non ci sono buone ragioni per farlo.

db<>violino qui
Vecchio sqlfiddle

Risposta correlata con più spiegazioni: