Re: Automatically fudging query results? - Mailing list pgsql-general

From Nick Barr
Subject Re: Automatically fudging query results?
Date
Msg-id 40AE165F.8070701@chuckie.co.uk
Whole thread Raw
In response to Automatically fudging query results?  ("Alex Scollay" <scollay3@hotmail.com>)
List pgsql-general
Alex Scollay wrote:

> Let's say I have a column whose values are all 2-digit integers, e.g.
> 82 (though it's actually a varchar field).
>
>> From now on, the column will be able to have 2-digit as well as 3-digit
>
> integers. In the application that uses these values, a value
> of the format x0y is considered to be the same as xy.
> E.g. values 82 and 802 are considered to be the same, 45 and 405 are
> considered to be the same, etc.
>
> Both formats still have to be supported in order to be compatible with
> historical data - I'm not in control of the database and unfortunately
> existing 2-digit data won't be converted to 3-digit.
>
> The application has many, many separate places where it reads from that
> table, e.g.
>    select colname from sometable where....
> And in many, many separate places it uses the same code (hard-coded)
> to split up each value into 2 digits, e.g. for value 82, it will
> split it up into the digits 8 and 2, and make use of them.
>
> Yep, that query and that code are scattered all over the place and are
> not in a common subroutine :( . So it would take a lot of work to change
> all of them.
>
> Question: Is there any way to specify the SQL query so that, when it
> sees a digit of the format xy, it automatically returns it as x0y?
> (e.g. if one row has the value 82 and another has the value 802, the SQL
> query fudges the returned rows so both of them have the value 802.)
> Maybe with regular expressions somehow?
>
> Even better, is there any way to do that on the database side without
> changing the query itself, e.g. with a trigger perhaps?
>
> _________________________________________________________________
> The new MSN 8: advanced junk mail protection and 2 months FREE*
> http://join.msn.com/?page=features/junkmail
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 5: Have you checked our extensive FAQ?
>
>               http://www.postgresql.org/docs/faqs/FAQ.html

temp=# create table temp (string1 varchar(8)) without oids;
CREATE TABLE
temp=# insert into temp values ('82');
INSERT 0 1
temp=# insert into temp values ('802');
INSERT 0 1
temp=# select * from temp;
 string1
---------
 82
 802
(2 rows)

temp=# select string1, case when char_length(string1)=3 then string1
when char_length(string1)=2 then substring(string1 from 1 for 1) || '0'
|| substring(string1 from 2 for 1) end from temp;
 string1 | case
---------+------
 82      | 802
 802     | 802

Now you could wrap this lot up in a view named the same as the original
table...

temp=# create table temp_table (string1 varchar(8)) without oids;
CREATE TABLE
temp=# insert into temp values ('82');
INSERT 0 1
temp=# insert into temp values ('802');
INSERT 0 1
temp=#  create view temp AS select case when char_length(string1)=3 then
string1 when char_length(string1)=2 then substring(string1 from 1 for 1)
|| '0' || substring(string1 from 2 for 1) end as string1 from temp_table;
CREATE VIEW
temp=# select * from temp;
 string1
---------
 802
 802



Hope thats almost clear


Nick




pgsql-general by date:

Previous
From: "Alex Scollay"
Date:
Subject: Automatically fudging query results?
Next
From: "Ed L."
Date:
Subject: Re: Am I locking more than I need to?