Postgres объединение таблиц с условием объединения, заданным для текстового массива - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть две таблицы в postgresql Одна таблица имеет вид

Create table table1(
  ID serial PRIMARY KEY,
  Type []Text
)



Create table table2(
type text,
sellerID int 
)

Теперь я хочу получить все строки из таблицы table1, имеющие тип такой же, как в table2, но проблема в том, что в table1 тип является массивом.

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Вы можете использовать ЛЮБОЙ оператор в условии JOIN:

select *
from table1 t1
  join table2 t2 on t2.type = any (t1.type);

Обратите внимание, что если типы в таблице1 соответствуют нескольким строкам в таблице2, вы получите дубликаты (из таблицы1), потому что это соединение работает. Может быть, вы хотите вместо условия EXISTS:

select *
from table1 t1
where exists (select * 
              from table2 t2
              where t2.type = any(t1.type));
0 голосов
/ 07 апреля 2020

В случае, если тип в таблице имеет идентифицируемый разделитель, такой как ',', ';' и др c. Вы можете переписать запрос как regexp_split_to_table (type, ',') или в версиях, более поздних, чем 9.5. Можно использовать также функцию unnest.

Например,

select * from 
( select id ,regexp_split_to_table(type,',') from table1)table1
inner join 
select * from table2 
on trim(table1.type) = trim(table2.type)

Можно найти еще один хороший пример - https://www.dbrnd.com/2017/03/postgresql-regexp_split_to_array-to-split-string-using-different-delimiters/

SELECT 
    a[1] AS DiskInfo
    ,a[2] AS DiskNumber
    ,a[3] AS MessageKeyword
FROM (
    SELECT regexp_split_to_array('Postgres Disk information , disk 2 , failed', ',')
) AS dt(a)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...