Fórum Root.cz

Hlavní témata => Server => Téma založeno: Boris Michalko 08. 07. 2010, 10:17:14

Název: PostgreSQL 8.3 operátor NOT IN
Přispěvatel: Boris Michalko 08. 07. 2010, 10:17:14
Ahoj,

potřeboval bych vysvětlit jak se přesně chová operátor NOT IN v PostgreSQL ve verzi 8.3.
Mám jeden dotaz:

select count(distinct permusername) from spacepermissions where spaceid = 112 and permusername IN (select permusername from spacepermissions where spaceid = 112 group by permusername having count(permtype) > 2) and permusername is not null;

Tady mi operátor IN funguje tak, jak bych předpokládal. Vybere mi 14 záznamů z 650.
Ale když změním dotaz na:

select count(distinct permusername) from spacepermissions where spaceid = 112 and permusername NOT IN (select permusername from spacepermissions where spaceid = 112 group by permusername having count(permtype) > 2) and permusername is not null;

nevybere mi doplněk množiny, tj. 636 záznamů ale 0 záznamů.

Děkuji
Boris
Název: Re: PostgreSQL 8.3 operátor NOT IN
Přispěvatel: x 08. 07. 2010, 13:30:13
druhé co by me napadlo je udelat toto

select count(distinct permusername) from spacepermissions where spaceid = 112 and permusername IN (select permusername from spacepermissions where spaceid = 112 group by permusername having count(permtype) <= 2) and permusername is not null;

ale proc se to chova tak jak se to chova v pripade not in nevim
Název: Re: PostgreSQL 8.3 operátor NOT IN
Přispěvatel: rooobertek 08. 07. 2010, 14:07:43
čo pridať do subquery jeden NOT NULL? NULLy robia paseku kade-tade.
Název: Re: PostgreSQL 8.3 operátor NOT IN
Přispěvatel: Pavel Stěhule 09. 07. 2010, 10:10:23
NOT IN operátor porovnává hodnotu s každým prvkem výsledku subselectu, a pokud subselect obsahuje byť jen jediný NULL, pak nemůže nastat shoda neboť NULL není rovna žádná hodnota. Řešením by mělo být WHERE val IS NOT NULL v subselectu.
Název: Re: PostgreSQL 8.3 operátor NOT IN
Přispěvatel: Boris Michalko 09. 07. 2010, 10:57:58
Děkuji za odpovědi.
Přidání podmínky permusername is not null do subselect-u vyřešilo problém.

Zdraví
Boris