Re: Automatically fudging query results?

Поиск
Список
Период
Сортировка
От Richard Huxton
Тема Re: Automatically fudging query results?
Дата
Msg-id 40AE1FAF.4020300@archonet.com
обсуждение исходный текст
Ответ на Automatically fudging query results?  ("Alex Scollay" <scollay3@hotmail.com>)
Список 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.

So the application doesn't think they're the same.

> 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.

You should probably correct that anyway.

> 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?

You could write a function make_3_digits(mycol) that returns the 3 digit
version. Although you said you wanted the 2-digit version above.

> Even better, is there any way to do that on the database side without
> changing the query itself, e.g. with a trigger perhaps?

If "82" and "802" have the same meaning, but you want "802" to be used
throughout, why not just replace all the "82" values everywhere? Write a
trigger so that all new values get converted to the correct format.

Or, you could rename the base tables, replace them with views and have
those views use a function to canonicalise the format of your type.

Or, build your own type that accepts either format but always returns
the 2-digit version.

But, if you really don't have control of the database you'll have to fix
the broken application.

--
   Richard Huxton
   Archonet Ltd

В списке pgsql-general по дате отправления:

Предыдущее
От: Bob.Henkel@hartfordlife.com
Дата:
Сообщение: Re: Automatically fudging query results?
Следующее
От: Tom Lane
Дата:
Сообщение: Re: Unix timestamp , unix timestamp with microseconds