在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);
答案 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
r3
和j3
演示ROW
如何只是用来澄清事物的干扰词。
如果元素的 number 和数据类型与行类型匹配,则可以将行(记录)强制转换为已注册的行类型 - names 输入字段被忽略。
答案 1 :(得分:2)
行构造函数可用于构建要存储在复合类型表列中的复合值,或者传递给接受复合参数的函数。 此外,可以比较两个行值或使用IS NULL或IS NOT NULL测试行。
示例:
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