Re: coalesce for null AND empty strings

From: Richard Huxton <dev(at)archonet(dot)com>
To: Ferdinand Gassauer <gassauer(at)kde(dot)org>
Cc: pgsql general <pgsql-general(at)postgresql(dot)org>
Subject: Re: coalesce for null AND empty strings
Date: 2007-03-30 08:19:35
Message-ID: 460CC817.3080501@archonet.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Don't forget to cc: the list!

Ferdinand Gassauer wrote:
> Am Freitag, 30. März 2007 schrieben Sie:
>> Ferdinand Gassauer wrote:
>>> Hi!
>>>
>>> it would be great to have a coalesce2 function which treats empty strings
>>> as null values.
>> Why? What is the use-case for this?
>>
>>> as far as I have seen, there are a lot of comments and coding solutions
>>> about this, but none is an "easy" one and all make the code a bit more
>>> complicated and more difficult to maintain.
>>>
>>> I have created this function.
>>> It's similar to nullif, but takes only ONE argument
>>>
>>> create or replace function "empty2null"(text_i varchar)
>>> returns varchar as $$
>>> declare
>>> text_p varchar;
>>> begin
>>> if text_i = ''
>>> then text_p := null;
>>> else text_p := text_i;
>>> end if;
>>> return text_p;
>>> end;
>>> $$ LANGUAGE plpgsql;
>> or even shorter:
>>
>> CREATE OR REPLACE FUNCTION empty2null(varchar) RETURNS varchar AS $$
>> SELECT CASE WHEN $1 = '' THEN NULL ELSE $1 END;
>> $$ LANGUAGE SQL;
>
> OK this shortens the function, but does not help to "solve" the coalesce
> problem
> coalecse(empty2null(var1),empty2null(var2),....empty2null(var-n))
> instead of
> coalecse2(var1,var2,...var-n)
>
> where the empty2null is doing it's job "inside" the coalesce.

Well, you can always write the four or five variations you want:
CREATE OR REPLACE FUNCTION coalesce_and_blank(varchar) ...
CREATE OR REPLACE FUNCTION coalesce_and_blank(varchar,varchar) ...
CREATE OR REPLACE FUNCTION coalesce_and_blank(varchar,varchar,varchar) ...
etc.

> BTW I use now
> if rtrim(text_i,' ') = ...
> to remove all blanks
>
> Badly enough null, empty strings and strings with blanks are not easy to
> distinguish and in most apps it is even impossible for the user, so this case
> has to be addressed somewhere.

Well, yes.

> a) make the application to handle this

Exactly. If you're going to allow NULLs to the user interface you'll
need some way to display them. If it's an unformatted text-field (e.g.
"description" or "name" you probably want NOT NULL.

> b) write a trigger on every table char not null field

Yes - if you want to trim leading/trailing spaces automatically. The
other thing you can do is define checks to make sure the first/last
character are not a space in the database, and the automatic trimming in
the application.

> c) have a confortable function, where needed. that's the idea

I'm still not sure where these nulls are coming from, if your
application isn't generating them.

--
Richard Huxton
Archonet Ltd

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Alban Hertroys 2007-03-30 08:41:45 Re: coalesce for null AND empty strings
Previous Message Richard Huxton 2007-03-30 07:32:51 Re: Postgres 8.2.3 or 8.1.8?