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