Как в выражении PostgreSQL WHERE найти все строки, чьи идентификаторы НЕ находятся в массиве? - PullRequest
2 голосов
/ 19 мая 2011

Хорошо, у меня есть хранимая процедура ... как найти все строки, чьи идентификаторы не находятся в массиве?(Имейте в виду, что я использую массив PostgreSQL, который создается динамически при создании хранимой процедуры

Пример:

|  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 |

В качестве бонуса я также не знаю, как создать массив и добавить идентификаторы ктак что, если у вас есть быстрый совет, как это сделать, это было бы чрезвычайно полезно.: -)

Ответы [ 3 ]

4 голосов
/ 19 мая 2011
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);
1 голос
/ 19 мая 2011

Если вы говорите о реальном массиве PostgreSQL , используйте

SELECT * FROM people WHERE NOT id = ANY ('{1,3}')
1 голос
/ 19 мая 2011

Просто удалите квадратные скобки:

WHERE id NOT IN (1,2)

В качестве бонуса ваше предложение NOT IN может быть заполнено подзапросом, который будет выглядеть следующим образом:

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

Вы также можете выполнить динамическую конкатенацию строк, чтобы сгенерировать разделенный запятыми набор и вставить его в специальный запрос.

...