Вопрос:

Postgres: проверить, содержит ли поле массива значение?

postgresql

24326 просмотра

5 ответа

20608 Репутация автора

Я уверен, что это дублирующий вопрос в том смысле, что ответ где-то там есть, но я не смог найти ответ после поиска в Google в течение 10 минут, поэтому я обратился к редакторам не закрывать его на основание, что это может быть полезно для других людей.

Я использую Postgres 9.5. Это мой стол:

        Column          │           Type            │                                Modifiers
─────────────────────────┼───────────────────────────┼─────────────────────────────────────────────────────────────────────────
 id                      │ integer                   │ not null default nextval('mytable_id_seq'::regclass)
 pmid                    │ character varying(200)    │
 pub_types               │ character varying(2000)[] │ not null

Я хочу найти все строки с "Журналом" в pub_types.

Я нашел документы и гуглил, и вот что я попробовал:

select * from mytable where ("Journal") IN pub_types;
select * from mytable where "Journal" IN pub_types;
select * from mytable where pub_types=ANY("Journal");
select * from mytable where pub_types IN ("Journal");
select * from mytable where where pub_types contains "Journal";

Я просмотрел документы по массиву postgres, но не вижу простого примера выполнения запроса, и все вопросы StackOverflow, похоже, основаны на более сложных примерах.

Автор: Richard Источник Размещён: 22.09.2016 03:45

Ответы (5)


35 плюса

11979 Репутация автора

Решение

Это должно работать:

select * from mytable where 'Journal'=ANY(pub_types);

т.е. синтаксис есть <value> = ANY ( <array> ). Также обратите внимание, что строковые литералы в postresql пишутся в одинарных кавычках.

Автор: redneb Размещён: 22.09.2016 03:49

0 плюса

3209 Репутация автора

Это сработало для меня:

select * from mytable
where array_to_string(pub_types, ',') like '%Journal%'

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

Автор: Shane Размещён: 08.06.2018 07:49

9 плюса

91 Репутация автора

С любым оператором вы можете искать только одно значение.

Например,

select * from mytable where 'Book' = ANY(pub_types);

Если вы хотите найти несколько значений, вы можете использовать оператор @> .

Например,

select * from mytable where pub_types @> '{"Journal", "Book"}';

Вы можете указать, в каком порядке вы когда-либо хотели.

Автор: Sudharsan Thumatti Размещён: 07.01.2019 06:54

1 плюс

12310 Репутация автора

Вместо этого INмы можем использовать ANYмассивы, приведенные к массиву enum, например:

create type example_enum as enum (
  'ENUM1', 'ENUM2'
);

create table example_table (
  id integer,
  enum_field example_enum
);

select 
  * 
from 
  example_table t
where
  t.enum_field = any(array['ENUM1', 'ENUM2']::example_enum[]);

Или мы все еще можем использовать предложение IN, но сначала мы должны «удалить его»:

select 
  * 
from 
  example_table t
where
  t.enum_field in (select unnest(array['ENUM1', 'ENUM2']::example_enum[]));

Пример: https://www.db-fiddle.com/f/LaUNi42HVuL2WufxQyEiC/0

Автор: Cepr0 Размещён: 11.01.2019 11:16

0 плюса

1 Репутация автора

let exampleArray = [1, 2, 3, 4, 5]; let exampleToString = exampleArray.toString (); // преобразовать в toString let query = "Select * from table_name, где column_name in (exampleToString)"; // Выполнить вышеуказанный запрос, чтобы получить ответ

Автор: Srikanth Размещён: 04.07.2019 12:48
Вопросы из категории :
32x32