Postgresql将规则添加到列中,以转换select上的数据
我希望有一个以一种格式(Postgis地理格式)存储数据的列,但无论何时对其进行select查询,都应该使用函数对其进行转换并以另一种格式返回 可能吗 它会影响像这样的查询吗Postgresql将规则添加到列中,以转换select上的数据,sql,postgresql,select,postgis,Sql,Postgresql,Select,Postgis,我希望有一个以一种格式(Postgis地理格式)存储数据的列,但无论何时对其进行select查询,都应该使用函数对其进行转换并以另一种格式返回 可能吗 它会影响像这样的查询吗 Update table set other_column = do_comething(column_with_transform_rule) 更新:在获得正确的需求之后,可以使用规则来完成这件事 SET search_path='tmp'; -- Create a table and a view on it DR
Update table set other_column = do_comething(column_with_transform_rule)
更新:在获得正确的需求之后,可以使用规则来完成这件事
SET search_path='tmp';
-- Create a table and a view on it
DROP TABLE nameless CASCADE;
CREATE TABLE nameless
( a INTEGER NOT NULL
, b INTEGER NOT NULL
, PRIMARY KEY (a,b)
);
CREATE VIEW clueless AS (
SELECT a, b
, a*b AS c
FROM nameless
);
-- Enter some data
INSERT INTO nameless(a,b)
SELECT a, b
FROM generate_series(1,5) a
, generate_series(11,12) b
;
CREATE RULE clue_i AS
ON INSERT TO clueless
DO INSTEAD (
INSERT INTO nameless(a,b)
VALUES (NEW.a, NEW.b)
;
);
CREATE RULE clue_d AS
ON DELETE TO clueless
DO INSTEAD (
DELETE FROM nameless na
WHERE na.a = OLD.a AND na.b = OLD.b
;
);
CREATE RULE clue_u AS
ON UPDATE TO clueless
DO INSTEAD (
UPDATE nameless na
SET a = NEW.a, b = NEW.b
WHERE na.a = OLD.a AND na.b = OLD.b
;
);
SELECT * FROM clueless;
INSERT INTO clueless(a,b)
SELECT 5+src.a, src.b-10
FROM clueless src
WHERE src.a >=4
;
-- EXPLAIN ANALYZE
UPDATE clueless
SET b=b+20
WHERE b < 10
;
SELECT * FROM clueless;
额外注意:规则不被认为是完成这类事情的首选方式
更新:在获得正确的需求之后,可以使用规则来完成这件事
SET search_path='tmp';
-- Create a table and a view on it
DROP TABLE nameless CASCADE;
CREATE TABLE nameless
( a INTEGER NOT NULL
, b INTEGER NOT NULL
, PRIMARY KEY (a,b)
);
CREATE VIEW clueless AS (
SELECT a, b
, a*b AS c
FROM nameless
);
-- Enter some data
INSERT INTO nameless(a,b)
SELECT a, b
FROM generate_series(1,5) a
, generate_series(11,12) b
;
CREATE RULE clue_i AS
ON INSERT TO clueless
DO INSTEAD (
INSERT INTO nameless(a,b)
VALUES (NEW.a, NEW.b)
;
);
CREATE RULE clue_d AS
ON DELETE TO clueless
DO INSTEAD (
DELETE FROM nameless na
WHERE na.a = OLD.a AND na.b = OLD.b
;
);
CREATE RULE clue_u AS
ON UPDATE TO clueless
DO INSTEAD (
UPDATE nameless na
SET a = NEW.a, b = NEW.b
WHERE na.a = OLD.a AND na.b = OLD.b
;
);
SELECT * FROM clueless;
INSERT INTO clueless(a,b)
SELECT 5+src.a, src.b-10
FROM clueless src
WHERE src.a >=4
;
-- EXPLAIN ANALYZE
UPDATE clueless
SET b=b+20
WHERE b < 10
;
SELECT * FROM clueless;
额外注意:规则不被认为是完成这类事情的首选方式。@a_horse_with_no_name view确实是一种解决方法,但由于脚本语言问题,它们不受欢迎。脚本语言问题???从客户端大小看,视图是一个表,当然是SELECT格式。@无名:这一定是我听过的不使用视图的最奇怪的原因。你应该更详细地解释你真正的问题是什么is@a_horse_with_no_name它确实被视为一张桌子。就是说,每个表都有一个映射器类,如果我要创建一个视图,就需要第二个映射器。另一个表名,另一个映射器。这与简单性背道而驰,因为在所有其他方面,它都是相同的,只有一个表。你可以为insert/update/delete制定规则,但这种方法在这里不太流行。@带有“无”名称视图的“马”确实是一种解决方法,但由于脚本语言问题,它们不受欢迎。脚本语言问题???从客户端大小看,视图是一个表,当然是SELECT格式。@无名:这一定是我听过的不使用视图的最奇怪的原因。你应该更详细地解释你真正的问题是什么is@a_horse_with_no_name它确实被视为一张桌子。就是说,每个表都有一个映射器类,如果我要创建一个视图,就需要第二个映射器。另一个表名,另一个映射器。这与简单性背道而驰,因为在所有其他方面,它都是相同的,只有一个表。你可以为insert/update/delete制定规则,但这种方法在这里不太流行。有点太讽刺了。我确实知道视图被视为一张表格,问题不在于此。好吧,你可以更清楚地解释你的问题,而不是强迫我们就真正的问题质问你。有点太讽刺了。我知道视图被视为一个表格,问题不在其中。好吧,你可以更清楚地解释你的问题,而不是强迫我们就真正的问题向你提问。
NOTICE: drop cascades to view clueless
DROP TABLE
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "nameless_pkey" for table "nameless"
CREATE TABLE
CREATE VIEW
INSERT 0 10
CREATE RULE
CREATE RULE
CREATE RULE
a | b | c
---+----+----
1 | 11 | 11
1 | 12 | 12
2 | 11 | 22
2 | 12 | 24
3 | 11 | 33
3 | 12 | 36
4 | 11 | 44
4 | 12 | 48
5 | 11 | 55
5 | 12 | 60
(10 rows)
INSERT 0 4
UPDATE 4
a | b | c
----+----+-----
1 | 11 | 11
1 | 12 | 12
2 | 11 | 22
2 | 12 | 24
3 | 11 | 33
3 | 12 | 36
4 | 11 | 44
4 | 12 | 48
5 | 11 | 55
5 | 12 | 60
9 | 21 | 189
9 | 22 | 198
10 | 21 | 210
10 | 22 | 220
(14 rows)