Обсуждение: select multiple immediate values, but in multiple rows

Поиск
Список
Период
Сортировка

select multiple immediate values, but in multiple rows

От
Luca Pireddu
Дата:
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  


Re: select multiple immediate values, but in multiple rows

От
Richard Huxton
Дата:
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


Re: select multiple immediate values, but in multiple rows

От
PFC
Дата:
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
>