Re: coalesce for null AND empty strings - Mailing list pgsql-general

From Richard Huxton
Subject Re: coalesce for null AND empty strings
Date
Msg-id 460CC817.3080501@archonet.com
Whole thread Raw
In response to coalesce for null AND empty strings  (Ferdinand Gassauer <gassauer@kde.org>)
Responses Re: coalesce for null AND empty strings  (Ferdinand Gassauer <gassauer@kde.org>)
List 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

pgsql-general by date:

Previous
From: Richard Huxton
Date:
Subject: Re: Postgres 8.2.3 or 8.1.8?
Next
From: Alban Hertroys
Date:
Subject: Re: coalesce for null AND empty strings