select distinct a NULL

Jan Serak sherry na pikebo.cz
Pátek Listopad 1 11:06:22 CET 2002


"Zíka Aleš, Ing." wrote:
> 
>         Nahodou jsem vcera narazil na takovou zvlastnost v PgSQL. Mam v
> tabulce sloupec, kde nektere radky maji NULL. Vypisu ho:
> 
> SELECT x FROM x;
> 
>     x
> ------
>     5
>    10
>  NULL
>  NULL
>    10
> (5 rows)
> 
>         Ale s klauzuli DISTINCT:
> 
> SELECT DISTINCT x FROM x;
> 
>     x
> ------
>     5
>    10
>  NULL
> (3 rows)
> 
>         Myslel jsem ze plati NULL != NULL, takze by tam radky s NULL
> hodnotou mely byt vsechny. Kdyz na to pole udelam UNIQUE index, nedovoli mi
> tam dat dve desitky, ale vic NULL mu nevadi.

hodnota libovolny_relacni_operator NULL se vyhodnocuje do false,
takze NULL=NULL je false a NULL!=NULL je taky false.

Semanticky je NULL povazovan za neznamou hodnotu, takze kdyz nejakou
hodnotu neznate, tak o ni nemuzete rict ani ze je s necim shodna ani
ze je od neceho odlisna.

UNIQUE index ohlida unikatnost ZNAMYCH hodnot, protoze o tech neznamych
to nelze zajistit, takze zaznamu s nevyplnenou hodnotou ve sloupci nad
nimz je UNIQUE index muzete mit libovolne mnoho.

Operator DISTINCT ponekud chybne interpretujete. Nejde o to, aby
vysledek
obsahoval navzajem ruzne hodnoty (hodnota1=hodnota2 vyhodnocena do
FALSE),
ale aby vyjmenoval vsechny zpusoby vyplneni daneho sloupce(-u).

Konkretne v Oracle je to syntakticky cukr (jestli je to i takto
implementovano,
nevim, zdrojaky jsem nevidel ;-), protoze

	SELECT distinct x FROM x

je totez co

	SELECT x FROM x GROUP BY x


> 
>         Jak to teda je, je to chovani SELECT DISTINCT normalni, nebo to je
> chyba?
> 

Skoro bych rekl, ze takhle to predepisuje nejaka norma SQL, ale nechce
se mi
to hledat. Urcite se stejne chova Oracle a neverim, ze by Oracle
opisoval chyby
z PG nebo naopak ;-)

							Jan Serak


Další informace o konferenci Test