ПостгресSQL. Как объединить два значения строки без дубликатов

У меня есть две строки, как показано ниже:

_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

Для этого конкретного формата вы можете заменить (var1, var2, '') || var2, но я не могу сказать, покроет ли это все ваши потребности.

Bjarni Ragnarsson 16.01.2023 21:50

Как обнаружить дублирование? Вы можете сделать что-то вроде _var_3 text := _var_1 || CASE WHEN _var_1 like '%' || _var_2 THEN '' ELSE _var_2 END;, чтобы, если _var_1 заканчивается полным текстом _var_2, он не объединялся. Однако вам понадобится более сложное регулярное выражение (вместо like), если вам нужно обрабатывать более сложные совпадения.

EdmCoff 16.01.2023 21:51
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предполагаю, что вы хотите рассматривать строки как списки слов, а затем вам нужно объединить их, как если бы они были наборами, которые нужно объединить, с сохранением порядка. В основном это делается с помощью следующего 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 

string_agg 815 ПАДЛИ 2 ДОРОГА 3 PL 4

рабочий пример

Однако это не та задача, которую можно решить в 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; Думаю, ваш ответ может мне помочь!

JuniorLittle 16.01.2023 22:56

хорошо, если входные значения представлены в виде двух столбцов в таблице с несколькими строками, вам, вероятно, придется lateral join результат regexp_split_to_array в эту таблицу, а затем partition by не только столбец val, но и идентификатор строки.

Tomáš Záluský 17.01.2023 08:48

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