反转 postgres 中的列
Reverse a column in postgres
所以我在 SQL 服务器中有一个 table 是这样定义的
create table test(value varchar(200), Reverse(value) as valueReverse);
现在,当我在此 table 中插入内容时,假设我插入了字符串 hello,它会将值存储在 table 中。
value | valueReverse
--------------------
hello | olleh
我正在尝试将 table 转换为 PostgreSQL,但是 reverse() 函数不起作用,它给我错误。在 postgres 中创建此 table 的正确方法是什么?
对于 PostgreSQL 12 及更高版本
如果您使用的是 Postgres 12 或更高版本,那么您可以对 valueReverse
列使用 GENERATED ALWAYS AS
,如下所示:Manual
create table test(value varchar(200),
valueReverse varchar(200) generated always as (reverse(value)) STORED );
对于 PostgreSQL 11 或更低版本
对于早期版本,您可以像下面那样使用 Triggers
。
创建触发器函数
create or replace function trig_reverse() returns trigger as
$$
begin
new.valueReverse=reverse(new.value);
return new;
end;
$$
language plpgsql
创建触发器
create trigger trig_rev
before insert or update on test
for each row
execute procedure trig_reverse();
不要不要 存储字符串两次(冗余)。将它存储一次并即时生成恢复的副本,总体上会更干净、更便宜。如果您需要直接替换 table:
,您可以使用 VIEW
CREATE TABLE base_test(value varchar(200));
INSERT INTO base_test VALUES ('hello');
CREATE VIEW test AS
SELECT *, reverse(value) AS value_reverse
FROM base_test;
db<>fiddle here
相关:
- Computed / calculated / virtual / derived columns in PostgreSQL
所以我在 SQL 服务器中有一个 table 是这样定义的
create table test(value varchar(200), Reverse(value) as valueReverse);
现在,当我在此 table 中插入内容时,假设我插入了字符串 hello,它会将值存储在 table 中。
value | valueReverse
--------------------
hello | olleh
我正在尝试将 table 转换为 PostgreSQL,但是 reverse() 函数不起作用,它给我错误。在 postgres 中创建此 table 的正确方法是什么?
对于 PostgreSQL 12 及更高版本
如果您使用的是 Postgres 12 或更高版本,那么您可以对 valueReverse
列使用 GENERATED ALWAYS AS
,如下所示:Manual
create table test(value varchar(200),
valueReverse varchar(200) generated always as (reverse(value)) STORED );
对于 PostgreSQL 11 或更低版本
对于早期版本,您可以像下面那样使用 Triggers
。
创建触发器函数
create or replace function trig_reverse() returns trigger as
$$
begin
new.valueReverse=reverse(new.value);
return new;
end;
$$
language plpgsql
创建触发器
create trigger trig_rev
before insert or update on test
for each row
execute procedure trig_reverse();
不要不要 存储字符串两次(冗余)。将它存储一次并即时生成恢复的副本,总体上会更干净、更便宜。如果您需要直接替换 table:
,您可以使用VIEW
CREATE TABLE base_test(value varchar(200));
INSERT INTO base_test VALUES ('hello');
CREATE VIEW test AS
SELECT *, reverse(value) AS value_reverse
FROM base_test;
db<>fiddle here
相关:
- Computed / calculated / virtual / derived columns in PostgreSQL