Re: [GENERAL][SQL] Getting multiple field unique index to distinguish NULLs.

From: Beth Strohmayer <strohmayer(at)itd(dot)nrl(dot)navy(dot)mil>
To: Stuart Rison <rison(at)biochemistry(dot)ucl(dot)ac(dot)uk>, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: pgsql-general <pgsql-general(at)postgresql(dot)org>, pgsql-sql <pgsql-sql(at)postgresql(dot)org>
Subject: Re: [GENERAL][SQL] Getting multiple field unique index to distinguish NULLs.
Date: 1999-09-10 19:10:05
Message-ID: 4.2.0.58.19990910145431.00a38340@pop
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general pgsql-sql


Is this problem with NULLS being treated as distinct values only apparent
in regards to Indices? If you do a Select Distinct or a Group By using
these fields does it display the duplicate rows with nulls? I know this
doesn't offer any help but I was just curious...

Beth :-)
_______________________________________________
/ Beth L Strohmayer / Software Engineer _____)
/ ITT Industries, Systems Division (_____|______________________
/ @ Naval Research Laboratory, Code 5542 | \
\ 4555 Overlook Ave. SW | Phone: (202) 404-3798 \
\ Washington, DC 20375 | Fax: (202) 404-7942 \
\_________________________________________| /
| strohmayer(at)itd(dot)nrl(dot)navy(dot)mil /
|____________________________/

At 11:37 AM 09/10/1999 , Stuart Rison wrote:
>Hi Tom,
>
>On Fri, 10 Sep 1999, Tom Lane wrote:
>
> > > The problem is that the indexing considers all NULLs to be distinct thus:
> >
> > Don't use NULLs ... declare the columns as NOT NULL, and select some
> > special value for the fields you want to consider unused. Zero maybe,
> > or an empty string if the columns are text.
> >
>
>Fair enough, and indeed it's a solution I've been using but, for the sake
>of argument, what if I couldn't do it?
>
>I though of using a index and functions such as:
>
>CREATE UNIQUE INDEX myscheme_idx ON myscheme_funcat
>(level1, null_to_zero(level2), null_to_zero(level3),
>null_to_zero(level4));
>
>but saddly, you can't use functions in that way to define indices or at
>least not in this way...
>
>I tried
>
>CREATE UNIQUE INDEX myscheme_idx ON myscheme_funcat
>(make_key(level1,level2,level3,level4) text_ops);
>
>Where make_key essentially concatenates the levels into a '.' separated
>key (e.g. 1 or 1.2.1 or 2.4.1.6).
>
>Now this would work except that there's a problem with pl/pgSQL such that
>when you pass several values to a plpgsql function and one of them is
>NULL, then all values passed to the function become NULL.
>
>The solution would be something like:
>
>CREATE UNIQUE INDEX myscheme_idx ON myscheme_funcat
>(make_key(level1,null_to_zero(level2),null_to_zero(level3),
>null_to_zero(level4));
>
>But saddly you can't have "sub-function" in the CREATE INDEX statement.
>
>So:
>
>1) yes, the solution would be to use 0 or somesuch token value for 'NULL'
>2) but I wondered if anybody had ventured into the kind of stuff mentioned
>above
>3) and if anybody have solved the pl/pgSQL 'issue' that turns all values
>to NULL?
>
>Regards,
>
>Stuart.
>
>
>************

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Steve Wolfe 1999-09-10 20:38:43 [Fwd: [GENERAL] arrays of tables]
Previous Message Tom Lane 1999-09-10 19:07:18 Re: [GENERAL][SQL] Getting multiple field unique index to distinguish NULLs.

Browse pgsql-sql by date

  From Date Subject
Next Message Wayne Piekarski 1999-09-11 05:13:34 Fast Backups With pg_dump
Previous Message Tom Lane 1999-09-10 19:07:18 Re: [GENERAL][SQL] Getting multiple field unique index to distinguish NULLs.