2017-07-31 90 views
1

我有一張表,我想從中刪除一系列行,但列表是變量(和硬編碼),所以我想定義一個輔助列表。 我知道我能做到這一點postgresql創建輔助列表

DELETE FROM table WHERE id IN (1, 4, 6, 7) 

但問題是,如果我可以定義一個名爲列表,就像我會在Java或Python做變量。

DEFINE list (1, 4, 6, 7) 

或類似的東西。

回答

1

嘗試使用值,例如:

t=# with aux_list(v) as (values (1),(4),(6),(7)) 
select * from generate_series(1,9,1) g where g in (select v from aux_list); 
g 
--- 
1 
4 
6 
7 
(4 rows) 
1

是的,可以。使用set語句設置值和current_setting()找回它:

set public.list to '{1,4,6,7}'; 

select * 
from generate_series(1,10) as i 
where i = any(current_setting('public.list')::int[]); 

注:

參數名稱應包含點,例如剛剛list是無效的。

我已經使用column in (<list>)的同義詞與數組允許列表作爲單個值。

set語句僅爲會話設置變量。如果您想保留它,請改爲使用alter ... set ...;

數據庫或

alter role my_role set public.list to '{1,4,6,7}'; 

針對特定用戶(你應該重新登錄進入這個情況的影響)。

的另一種方法是創建視圖:

create view list(x) as values(1),(4),(6),(7); 

,並以這種方式使用它:

select * 
from generate_series(1,10) as i 
where i in (table list);