什么是行构造函数用于?

时间:2015-08-23 09:04:15

标签: sql postgresql types row

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

具体是什么区别

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

其中f1的类型为intf2的类型为text

CREATE TYPE myrowtype AS (f1 int, f2 text, f3 numeric);

4 个答案:

答案 0 :(得分:3)

你是令人困惑的抽象层次。正如其他答案已经指出的那样,CREATE TYPE仅在系统中注册(复合/行)类型。而ROW构造函数实际上返回一行。

使用ROW构造函数创建的行类型不会保留列名称,当您尝试将行转换为JSON时,这一点会变得很明显。

在此过程中,ROW大部分时间只是一个 噪音词 The documentation:

  

当列表中有多个表达式时,关键字ROW是可选的。

第一个表达式保留原始列名称,而第二个或第三个表单不保留原始列名称。考虑一下这个演示:

SELECT t AS t1, 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<>小提琴here
SQL Fiddle

r3j3演示ROW如何只是用来澄清事物的干扰词。

如果元素的 number 数据类型与行类型匹配,则可以将行(记录)强制转换为已注册的行类型 - names 输入字段被忽略。

答案 1 :(得分:2)

行构造函数可用于构建要存储在复合类型表列中的复合值,或者传递给接受复合参数的函数。 此外,可以比较两个行值或使用IS NULL或IS NOT NULL测试行。

4.2.13. Row Constructors

示例:

CREATE TYPE myrowtype AS (f1 int, f2 text, f3 numeric);
CREATE TABLE mytable (ct myrowtype);
INSERT INTO mytable(ct) VALUES (CAST(ROW(11,'this is a test',2.5) AS myrowtype));

答案 2 :(得分:1)

您在询问类型之间的区别。

与OO语言中的对象和类之间的差异大致相同。

在第一种情况下,您构建的值可用于比较,行写入或传递给接受复合参数的函数。

在第二种情况下,您要定义一个可以在函数或表定义中使用的类型。

答案 3 :(得分:1)

ROW不是一个功能。它是SQL语法,更像是test=> SELECT t FROM (SELECT 1, 'x', NUMERIC '42.1') AS t; t ------------ (1,x,42.1) (1 row) test=> SELECT ROW(1, 'x', NUMERIC '42.1'); row ------------ (1,x,42.1) (1 row) 构造函数而不是函数。

test=> SELECT pg_typeof(t) FROM (SELECT 1, 'x', NUMERIC '42.1') AS t; pg_typeof ----------- record (1 row) test=> SELECT pg_typeof(ROW(1, 'x', NUMERIC '42.1')); pg_typeof ----------- record (1 row) 构造函数主要用于形成匿名记录。当您需要将字段集合保存在一起时,这可能很有用,但它们与现有表类型或复合数据类型不对应。

这两个在PostgreSQL中是等效的:

ROW

两者都创建了一个匿名记录:

CREATE TYPE myrowtype AS (f1 int, f2 text, f3 numeric);

myrowtype创建的记录可以对应于现有类型,因为当您将复合类型传递给函数时,例如:

test=> SELECT CAST(ROW(1, 'x', '42.1') AS myrowtype);
    row     
------------
 (1,x,42.1)
(1 row)

您可以使用

创建bezierPathWithArcCenter
clockwise = NO