【问题标题】:Postgresql add rule to column to transform data on selectPostgresql 向列添加规则以在选择时转换数据
【发布时间】:2012-04-04 08:47:39
【问题描述】:

我想要一个以一种格式(Postgis 地理格式)存储数据的列,但是每当它进行选择查询时,它应该用函数转换并以另一种格式返回。

有可能吗?

它会影响像

这样的查询吗
Update table set other_column = do_comething(column_with_transform_rule)

【问题讨论】:

  • @a_horse_with_no_name 视图确实是一种解决方法,但由于脚本语言问题不受欢迎。
  • 脚本语言问题???从客户端大小来看,视图一个表,当然在 SELECT 的情况下。
  • @Nameless:这一定是我听过的不使用视图的最奇怪的原因。你应该更详细地解释你真正的问题是什么
  • @a_horse_with_no_name 它确实被视为一张桌子。也就是说,我们为每个表都有一个映射器类,如果我要创建一个视图,则需要第二个映射器。另一个表名,另一个映射器。而且它与简单性背道而驰,因为在所有其他方面,它都是相同的,并且是一张桌子。
  • 您可以为插入/更新/删除制定 INSTEAD 规则,但这种方法在这里不是很流行。

标签: sql postgresql select postgis


【解决方案1】:
CREATE VIEW clueless AS (
    SELECT na.a, na.b,na.c
       , se.d,se.e, se.f
       , do_something_usefull ( na.g, se.i, 'clue' ) AS usefull
    FROM nameless na
    JOIN sense se ON se.clue_id = na.clue_id
    -- .. maybe more 
    );

更新:在得到正确的需求之后,这件事可以使用规则来完成。

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;

结果:

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)

额外说明:将规则视为完成此类事情的首选方式。

【讨论】:

  • 有点太讽刺了。我知道视图被视为一张表,问题不在于它。
  • 好吧,你可以更清楚地解释你的问题,而不是强迫我们就真正的问题向你提问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
  • 2021-08-24
  • 2011-12-21
  • 2011-04-23
相关资源
最近更新 更多