найти и заменить из таблицы

У меня есть table_A с некоторым текстом, и мне нужно выбрать новый текст из table_b и заменить его на table_a.

Это table_a:

select 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. {T3} Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. {T1} Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. {T2} Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. {T4} Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'::text as textvalue

Это table_b:

select '{T1}' as find, 'Test 1a Test 1b Test 1c' as newvalue
union all
select '{T2}' as find, 'Test 2a Test 2b Test 2c' as newvalue
union all
select '{T3}' as find, 'Test 3a Test 3b Test 3c' as newvalue
union all
select '{T4}' as find, 'Test 4a Test 4b Test 4c' as newvalue
order by find

Что я сделал до сих пор, но безуспешно:

select z.newtextvalue
from
(select t2.find, t2.newvalue, t1.textvalue, replace(lag(replace(t1.textvalue,t2.find,t2.newvalue)) over(order by t2.find),t2.find,t2.newvalue) as newtextvalue
from
(select 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. {T3} Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. {T1} Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. {T2} Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. {T4} Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'::text as textvalue) as t1,
(select '{T1}' as find, 'Test 1a Test 1b Test 1c' as newvalue
union 
select '{T2}' as find, 'Test 2a Test 2b Test 2c' as newvalue
union 
select '{T3}' as find, 'Test 3a Test 3b Test 3c' as newvalue
union 
select '{T4}' as find, 'Test 4a Test 4b Test 4c' as newvalue
order by find) as t2) as z
order by z.find desc limit 1

Плохой результат:

Lorem ipsum dolor sit amet, conctetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Тест 3a, тест 3b, тест 3c. {T1} Duis aute irure dolor в репретерит в сладострастном velit esse cillum dolore eu fugiat nulla pariatur. {T2} Excepteur sint occaecat cupidatat non proident, загорелся in culpa qui officia deserunt mollit anim id est Laborum. Тест 4a, тест 4b, тест 4c Lorem ipsum dolor sit amet, conctetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

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

Lorem ipsum dolor sit amet, conctetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Тест 3a, Test 3b, Test 3c. Выполнение минимального требования, которое необходимо для выполнения упражнений, выполняющих все необходимые действия, но не более чем аливируса. Тест 1a, Тест 1b, Тест 1c Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Тест 2a, Тест 2b, Тест 2c Excepteur sint occaecat cupidatat non proident, загорелся in culpa qui officia deserunt mollit anim id est Laborum. Тест 4a, Тест 4b, Тест 4c Lorem ipsum dolor sit amet, conctetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Любые предложения / исправления приветствуются!


person Groot    schedule 21.01.2020    source источник
comment
Я Грут. Можете ли вы придумать более короткий и понятный пример?   -  person Laurenz Albe    schedule 21.01.2020
comment
@LaurenzAlbe, я попытался резюмировать, но веб-сайт вынуждает меня подробно рассказывать, иначе я не могу опубликовать. В любом случае, у меня есть index и new_text в таблице B, и я хочу найти в таблице A ту часть текста, которая соответствует индексу в таблице B, и заменить ее текстом в таблице B, это было ясно?   -  person Groot    schedule 21.01.2020
comment
Примеры хороши, но, пожалуйста, используйте более короткий текст.   -  person Laurenz Albe    schedule 21.01.2020
comment
Ваш LAG() будет учитывать только предыдущую строку. Таким образом, для {T4} вы будете видеть только {T4} и из LAG () {T3}. Удалите свой LIMIT 1. Вместо этого вам может понадобиться здесь рекурсивный CTE, чтобы вы могли выполнять итерацию для каждого поиска / замены и обновления строки.   -  person JNevill    schedule 21.01.2020


Ответы (1)


Чтобы расширить мой комментарий. Поскольку LAG() будет рассматривать только текущую строку и предыдущую строку в вашей T2 таблице, он может выполнять поиск и замену только для двух строк. Ваши order by и limit захватывают замены для {t4} и (из-за вашего лага) {t3} и отбрасывают результаты (записи 2 и 3), в которых были заменены {t1} и / или {t2}.

Вместо этого вы можете рекурсивно выполнять поиск и замену T2 таблицы по мере прохождения всех ваших токенов.

Рассмотреть возможность:

WITH RECURSIVE fandr AS
(
    SELECT replace(t1.textvalue, t2.find, t2.newvalue) as textvalue, find as found, findorder
    FROM t1, t2
    WHERE t2.findOrder = 1
    UNION ALL
    SELECT replace(fandr.textvalue, t2.find, t2.newvalue) as textvalue, t2.find, t2.findorder
    FROM fandr, t2
    WHERE t2.findOrder = fandr.findorder + 1
)
, t2 AS
(
    select 1 as findorder, '{T1}' as find, 'Test 1a Test 1b Test 1c' as newvalue
    union 
    select 2 as findorder, '{T2}' as find, 'Test 2a Test 2b Test 2c' as newvalue
    union 
    select 3 as findorder, '{T3}' as find, 'Test 3a Test 3b Test 3c' as newvalue
    union 
    select 4 as findorder, '{T4}' as find, 'Test 4a Test 4b Test 4c' as newvalue
    order by find
) 
, t1 AS 
(
    select 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. {T3} Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. {T1} Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. {T2} Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. {T4} Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'::text as textvalue
)

SELECT * 
FROM fandr
ORDER BY findorder DESC LIMIT 1


+---+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------+---+
| 1 | Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Test 3a Test 3b Test 3c Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Test 1a Test 1b Test 1c Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Test 2a Test 2b Test 2c Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Test 4a Test 4b Test 4c Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. | {T4} | 4 |
+---+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------+---+

пример rextester

person JNevill    schedule 21.01.2020
comment
идеальное объяснение и пример, подходит для моих нужд. Большое спасибо. - person Groot; 21.01.2020