2011-05-19 41 views
2

好吧,我有一個存儲過程...我如何找到ID不在數組中的所有行? (記住,我使用的是動態創建的創建存儲過程時一個PostgreSQL陣列在PostgreSQL WHERE子句中,如何查找ID不在數組中的所有行?

實施例:

| people | 
------------- 
| id | Name | 
------------- 
| 1 | Bob | 
| 2 | Te | 
| 3 | Jack | 
| 4 | John | 

陣列具有somePGArray:= [1,3],因此一個僞 - 查詢應該是這樣的:

SELECT * FROM people WHERE id NOT IN (somePGArray) 

結果查詢:

| people | 
------------- 
| id | Name | 
------------- 
| 2 | Te | 
| 4 | John | 

作爲獎勵,我也不知道如何創建一個數組並附加ID到它,所以如果你有一個快速的提示如何做到這一點,這將是非常有用的。 :-)

回答

4
create table foo1 (id integer, name text); 
insert into foo1 values (1,'Bob'),(2,'Te'),(3,'Jack'),(4,'John'); 
select * from foo1 where id not in (1,2); 
select * from foo1 where not (id = ANY(ARRAY[1,2])); 

create or replace function so_example(int) 
returns SETOF foo1 as $$ 
declare 
    id alias for $1; 
    idlist int[] := '{1}'; 
    q text; 
    rec record; 
begin 
    idlist := idlist || ARRAY[id]; 
    q := 'select * from foo1 where not (id = ANY('||quote_literal(idlist)||'))'; 
    raise notice 'foo % %', idlist,q; 
    for rec in execute(q) loop 
    return next rec; 
    end loop; 
end; $$ 
language 'plpgsql'; 

select * from so_example(3); 
+0

甜蜜,聽起來像我們正在有些東西......真的很快,你能給出一個簡單的例子來說明如何創建初始數組,並且可能附加一個ID嗎? – btelles 2011-05-19 01:57:52

+0

@btelles:增加了運行查詢並動態添加數值的示例函數 – 2011-05-19 02:20:02

+0

很好,謝謝! – btelles 2011-05-19 03:14:07

1

只需刪除方括號:

WHERE id NOT IN (1,2) 

作爲獎勵,你NOT IN子句可以用一個子查詢看起來像填充:

Where id not in (select id from sometable where some_field = somevalue) 

你也可以做一個動態字符串連接來生成一個逗號分隔的集合並將其注入一個即席查詢。

+0

感謝保羅,但我真的需要那件事是因爲存儲過程運行時,它會動態創建一個數組。我已經澄清了這個問題。 – btelles 2011-05-19 01:52:23

+0

Plz看我的編輯。你可以使用子查詢嗎?如果有一個真正的數組,你可以用這些數值填充一個臨時表並對它進行子選擇。 – 2011-05-19 01:54:51

+0

對不起,我真的需要這個數組,因爲存儲過程的結構。 (作爲PostGIS查詢有幾個問題,不允許子查詢找到必要的ID。 – btelles 2011-05-19 01:54:56

1

如果你談論的是一個實際的PostgreSQL array,使用

SELECT * FROM people WHERE NOT id = ANY ('{1,3}') 
+0

是的,我對PostgreSQL中的數組不太熟悉,但是我需要一個,我認爲你是在正確的軌道上,我當然需要在數組中動態地添加元素,你能解釋一下嗎?如何做到這一點? – btelles 2011-05-19 02:00:02

+0

數組相關的函數被記錄在[這裏](http://www.postgresql.org/docs/current/static/functions-array.html)。'array_append'或者'||'運算符可能是w你正在尋找的帽子。在足夠新的版本中,['array_agg'](http://www.postgresql.org/docs/current/static/functions-aggregate.html)也可能有用。 – Anomie 2011-05-19 02:18:59

+0

如何處理字符串數組? – Udhaya 2017-10-11 11:25:11

相關問題