Thread: select multiple immediate values, but in multiple rows
Hello all. I'd like to write a query does a set subtraction A - B, but A is is a set of constants that I need to provide in the query as immediate values. I thought of something like select a from (1,2,3.4) except select col_name from table; but I don't know the syntax to specify my set of constants. I thought of doingselect 1 union select 2 union select 3 union ... except ... but I figure there must be a better way. The size of the set would be anywhere between 1 and about 5 or 6 elements. Is there a better way to do this? Thanks. Luca
Luca Pireddu wrote: > Hello all. I'd like to write a query does a set subtraction A - B, but A is > is a set of constants that I need to provide in the query as immediate > values. I thought of something like > > select a from (1,2,3.4) > except > select col_name from table; richardh=> SELECT * FROM foo; a --- 1 2 3 (3 rows) richardh=> SELECT * FROM foo WHERE a NOT IN (1,2); a --- 3 (1 row) Run some tests with nulls in the column and the constant list too so you understand what happens in those cases. -- Richard Huxton Archonet Ltd
You need a function like this : CREATE OR REPLACE FUNCTION array_srf( integer[] ) RETURNS SETOF integer LANGUAGE PLPGSQL etc... AS $$ DECLARE _data ALIAS FOR $1; _i INTEGER; BEGIN FOR _i IN 1..icount(_data) LOOP RETURN NEXT _data[_i]; END LOOP; RETURN; END; $$ select * from array_srf('{1,2,3,4}'); array_srf ----------- 1 2 3 4 (4 lignes) This will avoid you the UNION. > Hello all. I'd like to write a query does a set subtraction A - B, but > A is > is a set of constants that I need to provide in the query as immediate > values. I thought of something like > > select a from (1,2,3.4) > except > select col_name from table; > > but I don't know the syntax to specify my set of constants. I thought of > doing > select 1 union select 2 union select 3 union ... except ... > but I figure there must be a better way. The size of the set would be > anywhere between 1 and about 5 or 6 elements. Is there a better way to > do > this? > > Thanks. > > Luca > > ---------------------------(end of broadcast)--------------------------- > TIP 8: explain analyze is your friend >