PostgreSQL 8.3 operátor NOT IN

Boris Michalko

PostgreSQL 8.3 operátor NOT IN
« kdy: 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


x

Re: PostgreSQL 8.3 operátor NOT IN
« Odpověď #1 kdy: 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

Re: PostgreSQL 8.3 operátor NOT IN
« Odpověď #2 kdy: 08. 07. 2010, 14:07:43 »
čo pridať do subquery jeden NOT NULL? NULLy robia paseku kade-tade.

Pavel Stěhule

Re: PostgreSQL 8.3 operátor NOT IN
« Odpověď #3 kdy: 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.

Boris Michalko

Re: PostgreSQL 8.3 operátor NOT IN
« Odpověď #4 kdy: 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