Массив: не удалось найти тип массива для символа типа данных изменяющийся []

У меня есть следующие образцы данных для демонстрации:

Таблица:

create table tbl_array
(
   array_data varchar[]
);

Некоторые значения:

insert into tbl_array values('{AUS,USA}'),('{IND,SA}'),('{UK,UAE,NZ}'),('{CAN,BAN,SL,KW}');

Запрос: у меня есть входные значения{USA,AUS} или {KW,CAN,SL,BAN} или {UK,UAE,NZ}чтобы получить подробную информацию из tbl_array. Входные значения могут иметь любую последовательность.

Ожидаемый результат:

За {USA,AUS}:

array_data
-------------
{AUS,USA}

За {KW,CAN,SL,BAN}:

array_data
-------------
{CAN,BAN,SL,KW}

За {UK,UAE,NZ}:

array_data
-------------
{UK,UAE,NZ}

Попробуйте:

select *
from tbl_array where array_data = ALL('{USA,AUS}');

Получение ошибки:

не удалось найти тип массива для символа типа данных изменяющийся []

1 ответ

Решение

Попробуй это:

select * from tbl_array where array_data @> '{USA,AUS}' AND array_length(array_data, 1) = 2;

Он должен содержать оба (игнорировать порядок) и иметь длину 2 (чтобы исключить другие случаи, если хотите).

array_length(array_data, 1) 1 означает, что ваш массив одномерный.

Я также предполагаю, что в ваших массивах нет дубликатов.

Также обратите внимание, что массив содержит @> могут извлечь выгоду из индексов GIN.

Другие вопросы по тегам