你混淆了抽象层次。正如其他答案已经指出的那样,CREATE TYPE
只在系统中注册一个(复合/行)类型。虽然一个ROW
构造函数实际上返回一行。
使用创建的行类型ROW
构造函数不保留列名称,当您尝试将行转换为 JSON 时,这一点会变得很明显。
身处其中的同时,ROW
只是一个干扰词大多数时候。手册: https://www.postgresql.org/docs/current/sql-expressions.html#SQL-SYNTAX-ROW-CONSTRUCTORS
关键词ROW
当列表中有多个表达式时,该表达式为可选。
Demo:
SELECT t AS r1, row_to_json(t) AS j1
, ROW(1, 'x', numeric '42.1') AS r2, row_to_json(ROW(1, 'x', numeric '42.1')) AS j2
, (1, 'x', numeric '42.1') AS r3, row_to_json( (1, 'x', numeric '42.1')) AS j3
, (1, 'x', '42.1')::myrowtype AS r4, row_to_json((1, 'x', '42.1')::myrowtype) AS j4
FROM (SELECT 1, 'x', numeric '42.1') t;
db<>fiddle
Old sqlfiddle http://sqlfiddle.com/#!15/af436/1
r1
and j1
保留原始列名称。
r2
and j2
do not.
r3
and j3
是相同的;演示如何ROW
只是噪音。
r4
and j4
携带注册类型的列名。
您可以将行(记录)转换为已注册的行类型,如果number and 数据类型元素的数量与行类型匹配 -names的输入字段被忽略。
- 返回同一行的多列作为对象的 JSON 数组 https://stackoverflow.com/questions/26486784/return-multiple-columns-of-the-same-row-as-json-array-of-objects