У меня есть две строки, как показано ниже:
_var_1 text := '815 PAADLEY ROAD PL';
_var_2 text := 'PAADLEY ROAD PL';
_var_3 text;
Я хочу объединить эти две строки в одну строку и удалить дубликаты:
_var_3 := _var_1 || _var_2;
В результате переменная (_var_3) должна содержать только - 815 PAADLEY ROAD PL
без дубликатов.
Можете ли вы посоветовать или помочь порекомендовать какую-либо функцию PostgreSQL?
Я прочитал документацию и не смог найти нужную строковую функцию для решения этой проблемы... Я пытаюсь использовать regexp_split_to_table
, но ничего не работает.
Я пытался использовать этот метод, но это не то, что мне нужно, и слова в выводе перепутаны::
WITH ts AS (
SELECT
unnest(
string_to_array('815 PAADLEY ROAD PL PAADLEY ROAD PL', ' ')
) f
)
SELECT
f
FROM ts
GROUP BY f
-- f
-- 815
-- ROAD
-- PL
-- PAADLEY
Как обнаружить дублирование? Вы можете сделать что-то вроде _var_3 text := _var_1 || CASE WHEN _var_1 like '%' || _var_2 THEN '' ELSE _var_2 END;
, чтобы, если _var_1
заканчивается полным текстом _var_2
, он не объединялся. Однако вам понадобится более сложное регулярное выражение (вместо like
), если вам нужно обрабатывать более сложные совпадения.
Я предполагаю, что вы хотите рассматривать строки как списки слов, а затем вам нужно объединить их, как если бы они были наборами, которые нужно объединить, с сохранением порядка. В основном это делается с помощью следующего SQL:
with splitted (val, input_number, word_number) as (
select v, 1, i
from unnest(regexp_split_to_array('815 PAADLEY 2 ROAD 3 PL',' ')) with ordinality as t(v,i)
union
select v, 2, i
from unnest(regexp_split_to_array('PAADLEY ROAD 4 PL',' ')) with ordinality as t(v,i)
), numbered as (
select val, input_number, word_number, row_number() over (partition by val order by input_number, word_number) as rn
from splitted
)
select string_agg(val,' ' order by input_number, word_number)
from numbered
where rn = 1
Однако это не та задача, которую можно решить в SQL умным и элегантным способом. Кроме того, из вашей спецификации неясно, что делать с повторяющимися словами или если вы хотите обрабатывать несколько входных пар (оба требования возможны, хотя SQL, вероятно, не является подходящим инструментом). По крайней мере, пожалуйста, предоставьте больше примеров входных данных с ожидаемыми результатами.
У меня есть исходные данные из внешнего источника, и, как оказалось, мои поля (некоторые строки) имеют данные внутри field_1
, такие как field 2
+ field 3
. Я пытаюсь очистить данные и создать одно поле, оно будет объединять информацию из этих трех: field_1, field_2, field_3 167 KAMAM PL, 167, KAMAM PL; 87, 341, LL MOL ALLEY; 786 5th AVENUE, 786, 5th AVENUE; APAT 3, 7651, 3th ROAD; ,12581, 1th ROAD;
Думаю, ваш ответ может мне помочь!
хорошо, если входные значения представлены в виде двух столбцов в таблице с несколькими строками, вам, вероятно, придется lateral join
результат regexp_split_to_array
в эту таблицу, а затем partition by
не только столбец val
, но и идентификатор строки.
Для этого конкретного формата вы можете заменить (var1, var2, '') || var2, но я не могу сказать, покроет ли это все ваши потребности.