gpt4 book ai didi

PostgreSQL 类型方法

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

如何在 PostgreSQL 中创建类型方法?
让我们以下面的类型为例:

create type Employee as (
name varchar(20),
salary integer)

我该怎么做?

create method giveraise (percent integer) for Employee
begin
set self.salary = self.salary + (self.salary * percent) / 100;
end

最佳答案

你在评论中被告知,Postgres 没有类型方法。

但是,Postgres 支持 attribute notation用于执行具有单个参数的函数。这看起来几乎完全像该类型的方法。考虑这个简单的例子:

CREATE OR REPLACE FUNCTION raise10(numeric) 
RETURNS numeric LANGUAGE sql AS 'SELECT $1 * 1.1';

调用:

SELECT (100).raise10;

结果:

 raise10
---------
110.0

主要限制 是这仅适用于单个参数。无法为变量 raise 传递额外的参数,例如 percentage

同样适用于复合类型。有关此相关答案中“计算字段”的更多信息:
Store common query as column?

要更进一步,甚至可以在行上调用 UPDATE 并保留更改:

CREATE TABLE employee (
name text PRIMARY KEY,
salary numeric);

INSERT INTO employee VALUES
('foo', 100)
,('bar', 200);

CREATE OR REPLACE FUNCTION giveraise10(employee)
RETURNS numeric AS
$func$
UPDATE employee
SET salary = salary * 1.1 -- constant raise of 10%
WHERE name = ($1).name
RETURNING salary;
$func$ LANGUAGE sql;

调用:

SELECT *, e.giveraise10 FROM employee e;

结果:

 name | salary | giveraise10
------+--------+-------------
foo | 100 | 110.0
bar | 200 | 220.0

->sqlfiddle
SELECT 显示 salary 的更新前值,但该字段实际上已更新!

SELECT *, e.giveraise10 FROM employee e;

name | salary
------+--------
foo | 110.0
bar | 220.0

使用这种诡计是否明智由您决定。有更有效和透明的方法来更新表。

关于PostgreSQL 类型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14823221/

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