在 PostgreSQL 中,ROW()
函数有什么用?
具体有什么区别
SELECT ROW(t.f1, t.f2, 42) FROM t;
其中f1
是int
类型,f2
是text
类型
和
CREATE TYPE myrowtype AS (f1 int, f2 text, f3 numeric);
最佳答案
您混淆了抽象层次。正如其他答案已经指出的那样,CREATE TYPE
仅在系统中注册一个(复合/行)类型。而 ROW
构造函数实际上返回一行。
使用 ROW
构造函数创建的行类型不保留列名,这在您尝试将行转换为 JSON 时变得很明显。
在大多数情况下,ROW
只是一个干扰词。 The manual:
The key word
ROW
is optional when there is more than one expression in the list.
演示:
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 here
<子>旧sqlfiddle
r1
和 j1
保留原始列名。
r2
和 j2
没有。
r3
和j3
是一样的;来证明 ROW
只是噪音。
r4
和j4
带有注册类型的列名。
如果元素的 number 和 data types 匹配行类型 - names 的输入字段被忽略。
关于sql - 行构造函数有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32164926/