Re: null vs empty string - Mailing list pgsql-novice

From Frank Bax
Subject Re: null vs empty string
Date
Msg-id BLU0-SMTP4839D736FB06D0007AD6FDACCC0@phx.gbl
Whole thread Raw
In response to null vs empty string  (Kent Thomas <kent@solarbee.com>)
List pgsql-novice
Kent Thomas wrote:
> I have the following query:
>
> SELECT * FROM "sales_projects" WHERE (((sales_projects.prospect ILIKE E'%rancho murieta%') OR
(sales_projects.prospect_typeILIKE E'%rancho murieta%') OR (sales_projects.application ILIKE E'%rancho murieta%') OR
(sales_projects.projectILIKE E'%rancho murieta%') OR (sales_projects.city ILIKE E'%rancho murieta%') OR
(sales_projects.stateILIKE E'%rancho murieta%') OR (sales_projects.project_status ILIKE E'%rancho murieta%')) AND
(((sales_projects.project_status!= E'Dead') AND (sales_projects.project_status != E'Ordered')) AND
((sales_projects.statusIN (E'Active',E'Expired')) AND (sales_projects.kind = E'Project')))) 
>
> Yes, it is ugly, but that's not the issue.  This query returns just one record when I would expect it to return two.
Theonly difference in the two records is in the sales_projects.project_status field.  One record has an empty string,
thesecond has a null value.  The NULL value in sales_projects.project_status is not returned. 
>
> Can someone explain why the NULL value in sales_projects.project_status field does not fit this query?


Others have already explained this; but they did not mention coalecse()
which might be useful for you.


> Secondly, can you offer some advice to EXCLUDE records where sales_projects.project_status is Ordered and Dead?


You already do this with

(sales_projects.project_status != E'Dead') AND
(sales_projects.project_status != E'Ordered')

As a general rule:

"(NOT A) AND (NOT B)" is the same as "NOT (A OR B)"

So you could also write:

NOT ( (sales_projects.project_status = E'Dead') OR
(sales_projects.project_status != E'Ordered')

If you wish to avoid some of the "ugly", then try:

sales_projects.project_status NOT IN (E'Dead',E'Ordered')

Of course, all these examples will still EXCLUDE the NULL values; so
perhaps you want this:

coalesce(sales_projects.project_status,'') NOT IN (E'Dead',E'Ordered')

pgsql-novice by date:

Previous
From: Tim Landscheidt
Date:
Subject: Re: Timestamp with time zone
Next
From: "Bidski"
Date:
Subject: Re: Compiling under MSYS and Windows 7