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.
[...]
LeROW
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