gpt4 book ai didi

sql - PostgreSQL 将记录转换为复合类型

转载 作者:行者123 更新时间:2023-11-29 11:13:20 25 4
gpt4 key购买 nike

我们知道,有一种简单的方法可以将任何记录转换为 PostgreSQL 中相应的复合类型,如下所示:

CREATE TYPE test.t_test AS (
mytext text,
myint integer
);

SELECT ('text', 10)::test.t_test; -- will succeed

但这样做的一个不便之处在于——如果目标类型被修改(例如添加了一个字段)——转换将会中断 :(

ALTER TYPE test.t_test ADD ATTRIBUTE mychar char(1);

SELECT ('text', 10)::test.t_test; -- will fail
对于这种情况,

CREATE CAST 可能会有所帮助,但我无法将像 RECORD 这样的伪类型作为参数传递给转换函数。类型继承和复合类型默认值(如表)都不起作用。这里有没有其他办法可以实现兼容?

当然可以使用显式转换函数,例如 CREATE FUNCTION test.to_t_test(t text, i integer, c char DEFAULT '') RETURNS test.t_test 然后执行

SELECT test.to_t_test('text', 10)  -- OK
SELECT test.to_t_test('text', 10, '1') -- OK

然后使用默认参数值。但这种方式既不清晰也不舒适。

最佳答案

我的建议是,如果您需要这样做,请采取以下方法之一:

  1. 结构的动态发现(使用 pg_attribute 目录表)。这不能保证将来是安全的,但可能是。它也有很多陷阱(例如,不要使用 attnum 小于 0 的属性)。这通常是我采用的方法,并用 Perl 编写了库以在客户端进行此类发现。

  2. 创建一个使用类型和一个存储类型,并在它们之间进行转换。因此,您可以执行 SELECT ('text', 10)::test.used_test::test.stored_test 并且可以正常工作。但是你不能将记录转换为复合类型是有原因的。

关于sql - PostgreSQL 将记录转换为复合类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22980849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com