Обсуждение: where with NULL values are not selected

Поиск
Список
Период
Сортировка

where with NULL values are not selected

От
Düster Horst
Дата:
I try to join two tables whereas some column values do have NULL values with
the following query:

select table1.column from table1, table2 where table1.column=table2.column

table1.column and table2.column may have NULL values. The problem is that
these columns where not selected. Does there exists any solution to
select/join the NULL value colums also.

I would be appeciate about any hint.

PostgreSQL 7.4.5

With best regards
Horst Duester



---------------------------------
 
Dr. Horst Düster
GIS-Koordinator /Amtschef Stv.

Kanton Solothurn 
Amt für Geoinformation
Abteilung SO!GIS Koordination
Werkhofstr. 65
CH-4509 Solothurn

Tel.: ++41 (0)32 627 25 32
Fax: ++41 (0)32 627 22 14

horst.duester@bd.so.ch
www.sogis.so.ch


Re: where with NULL values are not selected

От
Peter Eisentraut
Дата:
Am Freitag, 8. Juli 2005 12:08 schrieb Düster Horst:
> table1.column and table2.column may have NULL values. The problem is that
> these columns where not selected. Does there exists any solution to
> select/join the NULL value colums also.

Read up on outer joins.  In your case, try this:

select table1.column from table1 full outer join table2 on
(table1.column=table2.column);

--
Peter Eisentraut
http://developer.postgresql.org/~petere/

Re: where with NULL values are not selected

От
Dawid Kuroczko
Дата:
On 7/8/05, Düster Horst <Horst.Duester@bd.so.ch> wrote:
> I try to join two tables whereas some column values do have NULL values with
> the following query:
>
> select table1.column from table1, table2 where table1.column=table2.column
>
> table1.column and table2.column may have NULL values. The problem is that
> these columns where not selected. Does there exists any solution to
> select/join the NULL value colums also.

A hint:
qnex=# SELECT 'ok' WHERE NULL=NULL;
?column?
(0 rows)

In other words -- NULL is not equal to NULL.  NULL is not a value, NULL
is a state.  If you want to join those columns, you cannot use NULL
as a joining key.  It's the way SQL works.

Anyway, a quick-and-dirty solution might be:

select table1.column from table1, table2 where
coalesce(table1.column,-1)=coalesce(table2.column, -1);

..assuming column doesn't have '-1' value.

A better solution would be to rethink your design (don't use NULLs).


Incientally, instead of using this syntax:
select table1.column from table1, table2 where table1.column=table2.column;
..try using explicit inner joins:
select table1.column from table1 JOIN table2 USING(column);

Regards,
    Dawid

---------------------------(end of broadcast)---------------------------
TIP 2: Don't 'kill -9' the postmaster


Re: where with NULL values are not selected

От
Enrico Weigelt
Дата:
* Dawid Kuroczko <qnex42@gmail.com> wrote:

<snip>
> A hint:
> qnex=# SELECT 'ok' WHERE NULL=NULL;
> ?column?
> (0 rows)
>
> In other words -- NULL is not equal to NULL.  NULL is not a value, NULL
> is a state.  If you want to join those columns, you cannot use NULL
> as a joining key.  It's the way SQL works.

Thats the statement of the day ;-)
In fact, postgres does not store empty fields, so you can save
space in long living and large tables (ie. journals) by setting
unneeded fields to NULL.

> Anyway, a quick-and-dirty solution might be:
>
> select table1.column from table1, table2 where
> coalesce(table1.column,-1)=coalesce(table2.column, -1);
>
> ...assuming column doesn't have '-1' value.

better: add the missing case (A and B are NULL) to the
where clause:

SELECT ... FROM table1, table2 WHERE
    (table1.column=table2.column) OR
    ((table1.column IS NULL) AND
     (table2.column IS NULL));


cu
--
---------------------------------------------------------------------
 Enrico Weigelt    ==   metux IT service
  phone:     +49 36207 519931         www:       http://www.metux.de/
  fax:       +49 36207 519932         email:     contact@metux.de
---------------------------------------------------------------------
  Realtime Forex/Stock Exchange trading powered by postgresSQL :))
                                            http://www.fxignal.net/
---------------------------------------------------------------------

Re: where with NULL values are not selected

От
Düster Horst
Дата:
The problem is solved. The coalesce() function was the solution. Thank you
very much for your input.

With best regards

Horst Düster

---------------------------------
 
Dr. Horst Düster
GIS-Koordinator /Amtschef Stv.

Kanton Solothurn 
Amt für Geoinformation
Abteilung SO!GIS Koordination
Werkhofstr. 65
CH-4509 Solothurn

Tel.: ++41 (0)32 627 25 32
Fax: ++41 (0)32 627 22 14

horst.duester@bd.so.ch
www.sogis.so.ch



-----Ursprüngliche Nachricht-----
Von: Dawid Kuroczko [mailto:qnex42@gmail.com]
Gesendet am: Freitag, 8. Juli 2005 11:08
An: Düster Horst
Cc: pgsql-admin@postgresql.org
Betreff: Re: [ADMIN] where with NULL values are not selected

On 7/8/05, Düster Horst <Horst.Duester@bd.so.ch> wrote:
> I try to join two tables whereas some column values do have NULL values
with
> the following query:
>
> select table1.column from table1, table2 where table1.column=table2.column
>
> table1.column and table2.column may have NULL values. The problem is that
> these columns where not selected. Does there exists any solution to
> select/join the NULL value colums also.

A hint:
qnex=# SELECT 'ok' WHERE NULL=NULL;
?column?
(0 rows)

In other words -- NULL is not equal to NULL.  NULL is not a value, NULL
is a state.  If you want to join those columns, you cannot use NULL
as a joining key.  It's the way SQL works.

Anyway, a quick-and-dirty solution might be:

select table1.column from table1, table2 where
coalesce(table1.column,-1)=coalesce(table2.column, -1);

...assuming column doesn't have '-1' value.

A better solution would be to rethink your design (don't use NULLs).


Incientally, instead of using this syntax:
select table1.column from table1, table2 where table1.column=table2.column;
...try using explicit inner joins:
select table1.column from table1 JOIN table2 USING(column);

Regards,
    Dawid

Re: where with NULL values are not selected

От
Dawid Kuroczko
Дата:
On 7/8/05, Düster Horst <Horst.Duester@bd.so.ch> wrote:
> I try to join two tables whereas some column values do have NULL values with
> the following query:
>
> select table1.column from table1, table2 where table1.column=table2.column
>
> table1.column and table2.column may have NULL values. The problem is that
> these columns where not selected. Does there exists any solution to
> select/join the NULL value colums also.

A hint:
qnex=# SELECT 'ok' WHERE NULL=NULL;
?column?
(0 rows)

In other words -- NULL is not equal to NULL.  NULL is not a value, NULL
is a state.  If you want to join those columns, you cannot use NULL
as a joining key.  It's the way SQL works.

Anyway, a quick-and-dirty solution might be:

select table1.column from table1, table2 where
coalesce(table1.column,-1)=coalesce(table2.column, -1);

..assuming column doesn't have '-1' value.

A better solution would be to rethink your design (don't use NULLs).


Incientally, instead of using this syntax:
select table1.column from table1, table2 where table1.column=table2.column;
..try using explicit inner joins:
select table1.column from table1 JOIN table2 USING(column);

Regards,
    Dawid

---------------------------(end of broadcast)---------------------------
TIP 2: Don't 'kill -9' the postmaster