Skip to content

行构造函数

什么是行构造函数?

行构造函数是一种特殊的表达式,用于创建行值(也称为复合值)。它允许我们在一个表达式中同时构建多个字段值的组合。

语法格式基本语法:

sql
ROW(值1, 值2, ..., 值n)

或者省略 ROW 关键字:

sql
(值1, 值2, ..., 值n)

当列表中有多个表达式时,关键字 `ROW` 是可选的。单个表达式必须使用 `ROW` 关键字,以避免与普通括号表达式混淆。

基本用法示例

简单行构造

sql
-- 创建一个包含整数、浮点数和文本的行
SELECT ROW(1, 2.5, 'this is a test');

-- 省略ROW关键字的等效写法
SELECT (1, 2.5, 'this is a test');

使用 .* 语法扩展行值

行构造函数可以使用 rowvalue.* 语法,它会自动展开为行值的所有元素列表,类似于 SELECT 语句中的 .* 语法。

INFO

展开表的所有列假设有一个表 t 包含列 f1f2,以下两个查询是等效的:

sql
-- 使用 .* 语法自动展开所有列
SELECT ROW(t.*, 42) FROM t;

-- 等效于手动列出所有列
SELECT ROW(t.f1, t.f2, 42) FROM t;

在 PostgreSQL 8.2 之前,`.*` 语法在行构造函数中的行为不同,它不会展开列而是创建嵌套行值。如果您需要向后兼容或创建嵌套行值,请直接使用表名而不使用 `.*`,例如:`ROW(t, 42)`。

行类型和类型转换

默认情况下,ROW 表达式创建的值是匿名记录类型。在某些情况下,我们需要将这个匿名类型转换为具名的复合类型。

具名的复合类型可以是:

  1. 表的行类型(表的结构定义了类型)
  2. 使用 CREATE TYPE AS 创建的自定义复合类型

类型转换示例

下面的示例演示了在使用函数和行构造函数时可能需要的类型转换:

sql
-- 创建一个表和一个函数
CREATE TABLE mytable(f1 int, f2 float, f3 text);

CREATE FUNCTION getf1(mytable) RETURNS int AS 'SELECT $1.f1' LANGUAGE SQL;

-- 无需类型转换,因为只有一个getf1()函数
SELECT getf1(ROW(1, 2.5, 'this is a test'));