Unix Technical Forum

SEO

vBulletin Search Engine Optimization


Go Back   Unix Technical Forum > Database Server Software > PostgreSQL > Pgsql General

Register FAQ Members List Calendar Search Today's Posts Mark Forums Read
  #1 (permalink)  
Old 05-07-2008, 10:17 AM
James B. Byrne
 
Posts: n/a
Default Rules to provide a virtual column

This might be a little off topic and it may show a degree of naivety on my
part but I have a small problem with coding a Ruby on Rails application and it
seems to me that the best answer may reside in the database itself.

The situation is this. A dependent table relationship is episodic. In other
words, a product might be available for a period of time, then not available,
then available again. Or, a firm might be a client for a period, then not,
then again. Or a person might be an employee, then not, then again. Further,
past intervals of activity must be preserved.

The way that we handle this is through two columns in the dependent table;
effective_from and superseded_after. Thus an active row is retrieved via the
following code:

SELECT * FROM table WHERE ("table"."effective_from <= "current_date" AND
( "table"."superseded" IS NULL OR
"table"."superseded" >= "current_date" ) )

The difficulty arises from the implementation of the Rails generated SQL
SELECTs which freezes any datetime employed therein to the instant that the
model is first evaluated. There is a way around this but it is fairly tedious
and has to be repeated in numerous places because of the evaluate once
difficulty referred to above.

It seems to me that there should be a fairly easy way to construct a function
on such a table to derive a BOOLEAN value for a virtual column named "active"
based upon the SELECT criteria given above. However, I am unsure if this is in
fact possible and, if so, how to do this.

Can someone show me how this could be accomplished? And, can someone correct
my use of current_date in the example given above if require?

Regards,

--
*** E-Mail is NOT a SECURE channel ***
James B. Byrne mailto:ByrneJB@Harte-Lyne.ca
Harte & Lyne Limited http://www.harte-lyne.ca
9 Brockley Drive vox: +1 905 561 1241
Hamilton, Ontario fax: +1 905 561 0757
Canada L8E 3C3


--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
  #2 (permalink)  
Old 05-07-2008, 10:17 AM
Albe Laurenz *EXTERN*
 
Posts: n/a
Default Re: Rules to provide a virtual column

James B. Byrne wrote:
> The situation is this. A dependent table relationship is episodic. In other
> words, a product might be available for a period of time, then not available,
> then available again. Or, a firm might be a client for a period, then not,
> then again. Or a person might be an employee, then not, then again. Further,
> past intervals of activity must be preserved.
>
> The way that we handle this is through two columns in the dependent table;
> effective_from and superseded_after. Thus an active row is retrieved viathe
> following code:
>
> SELECT * FROM table WHERE ("table"."effective_from <= "current_date" AND
> ( "table"."superseded" IS NULL OR
> "table"."superseded" >= "current_date" ) )
>
> The difficulty arises from the implementation of the Rails generated SQL
> SELECTs which freezes any datetime employed therein to the instant that the
> model is first evaluated. There is a way around this but it is fairly tedious
> and has to be repeated in numerous places because of the evaluate once
> difficulty referred to above.
>
> It seems to me that there should be a fairly easy way to construct a function
> on such a table to derive a BOOLEAN value for a virtual column named "active"
> based upon the SELECT criteria given above. However, I am unsure if this is in
> fact possible and, if so, how to do this.
>
> Can someone show me how this could be accomplished? And, can someone correct
> my use of current_date in the example given above if require?


I am not sure if that can solve your problem, but you could use views:

test=> CREATE TABLE test (id integer PRIMARY KEY,
test-> val text,
test-> effective_from date NOT NULL,
test-> superseded date);

test=> CREATE VIEW test_view (id, val, active) AS
test-> SELECT id,
test-> val,
test-> (effective_from <= current_date AND (superseded IS NULL OR superseded >= current_date))
test-> FROM test;

test=> INSERT INTO test (id, val, effective_from, superseded)
test-> VALUES (1, 'one', '2007-01-01', NULL);
test=> INSERT INTO test (id, val, effective_from, superseded)
test-> VALUES (2, 'two', '2007-01-01', '2007-12-31');
test=> INSERT INTO test (id, val, effective_from, superseded)
test-> VALUES (3, 'three', '2009-01-01', NULL);

test=> SELECT * FROM test_view;
id | val | active
----+-------+--------
1 | one | t
2 | two | f
3 | three | f
(3 rows)

Yours,
Laurenz Albe

--
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Reply With Quote
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On



All times are GMT. The time now is 07:24 AM.


Powered by vBulletin® Version 3.6.5
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145