Appearance
行构造函数
什么是行构造函数?
行构造函数是一种特殊的表达式,用于创建行值(也称为复合值)。它允许我们在一个表达式中同时构建多个字段值的组合。
语法格式基本语法:
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
包含列 f1
和 f2
,以下两个查询是等效的:
sql
-- 使用 .* 语法自动展开所有列
SELECT ROW(t.*, 42) FROM t;
-- 等效于手动列出所有列
SELECT ROW(t.f1, t.f2, 42) FROM t;
在 PostgreSQL 8.2 之前,`.*` 语法在行构造函数中的行为不同,它不会展开列而是创建嵌套行值。如果您需要向后兼容或创建嵌套行值,请直接使用表名而不使用 `.*`,例如:`ROW(t, 42)`。
行类型和类型转换
默认情况下,ROW
表达式创建的值是匿名记录类型。在某些情况下,我们需要将这个匿名类型转换为具名的复合类型。
具名的复合类型可以是:
- 表的行类型(表的结构定义了类型)
- 使用
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'));