PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PostgreSQL, état SQL :42601

Ceci construit une valeur composite anonyme :

select (1, 'a');

Par exemple :

=> select (1, 'a');
  row  
-------
 (1,a)
(1 row)

=> select row(1, 'a');
  row  
-------
 (1,a)
(1 row)

Notez qu'il s'agit d'une seule valeur composite, et non de plusieurs valeurs.

Extrait du bon manuel :

8.16.2. Entrée de valeur composite

Pour écrire une valeur composite sous forme de constante littérale, placez les valeurs de champ entre parenthèses et séparez-les par des virgules. Vous pouvez mettre des guillemets doubles autour de n'importe quelle valeur de champ, et vous devez le faire s'il contient des virgules ou des parenthèses.
[...]
Le ROW La syntaxe d'expression peut également être utilisée pour construire des valeurs composites. Dans la plupart des cas, cela est considérablement plus simple à utiliser que la syntaxe littérale de chaîne puisque vous n'avez pas à vous soucier de plusieurs couches de guillemets. Nous avons déjà utilisé cette méthode ci-dessus :

ROW('fuzzy dice', 42, 1.99)
ROW('', 42, NULL)

Le ROW mot-clé est en fait facultatif tant que vous avez plus d'un champ dans l'expression, donc ceux-ci peuvent se simplifier en :

('fuzzy dice', 42, 1.99)
('', 42, NULL)

Les constructeurs de lignes section pourrait également être d'intérêt.

Quand tu dis ceci :

INSERT INTO circuit (id_circuit, description, date_start, date_end, speed,
length, duration)
SELECT (...)
FROM segment seg, wgs cir where seg.id = 13077

votre SELECT la clause n'a qu'une seule colonne dans l'ensemble (...) expression représente une valeur unique. La solution consiste simplement à supprimer ces parenthèses :

INSERT INTO circuit (id_circuit, description, date_start, date_end, speed, length, duration)
SELECT seg.id_segment, ..., (seg.date_end - seg.date_start)
FROM segment seg, wgs cir where seg.id = 13077