2012-04-04 7 views
1

データを1つのフォーマット(Postgis地理フォーマット)で格納するカラムを持っていますが、selectクエリの対象となるたびに関数で変換して別のフォーマットフォーマット。Postgresqlは選択時にデータを変換するカラムにルールを追加

それは可能ですか?右の要件を取得した後、この事規則を使用して行うことができます。

それは

Update table set other_column = do_comething(column_with_transform_rule) 
+0

なぜビューを使用しないのですか? –

+0

@a_horse_with_no_nameビューは確かにそれを解決する方法ですが、スクリプト言語の問題のために歓迎されません。 – Nameless

+1

スクリプト言語の問題???クライアントのサイズから見ると、SELECTの場合は確かにテーブル*です。 – wildplasser

答えて

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 
    ); 

UPDATEようなクエリに影響を与えます。

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) 

エクストラノート:ルールはない好ましい方法は、この種のものを達成するために考えられています。

+0

ちょっと皮肉です。私はビューがテーブルとして見えることを知っています、問題はそれではありません。 – Nameless

+0

さて、本当の問題についてあなたに疑問を抱かせるのではなく、あなたの問題をもう少し明確にすることができました。 – wildplasser

関連する問題