sql - 行构造函数有什么用?

标签 sql postgresql types row

在 PostgreSQL 中,ROW() 函数有什么用?

具体有什么区别

SELECT ROW(t.f1, t.f2, 42) FROM t;

其中f1int类型,f2text类型

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

r1j1 保留原始列名。
r2j2 没有。
r3j3 是一样的;来证明 ROW 只是噪音。
r4j4 带有注册类型的列名。

如果元素的 numberdata types 匹配行类型 - names 的输入字段被忽略。

关于sql - 行构造函数有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32164926/

相关文章:

sql - 使用 SUM 聚合函数提高 group by 子句的性能

postgresql - 时间戳分辨率

postgresql - 新的 Heroku pg :backups public-url provide? 是什么类型的文件

python - 如何更改 dask 数据框中列的数据类型?

scala - 如何从类型中提取类型参数

Java 通用问题

如果任何字段包含 NULL,MySQL CONCAT 将返回 NULL

mysql - 带有 count(*) 的子查询

MySQL REPLACE 影响 0 行但 WHERE ... LIKE 返回 90

sql - 如何将 array_agg() 用于 varchar[]