найти и заменить из таблицы - PullRequest
0 голосов
/ 21 января 2020

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

This это 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, Concetetur Adipiscing Elit, Sed Do EiusMod Tempor Incididunt UT Labore et Dolore Magna Aliqua. Испытание 3a Испытание 3b Испытание 3 c Ut enim ad minim veniam, quis nostrud упражнение ullamco labouris nisi ut aliquip ex ea кассовый след. {T1} Duis aute irure dolor в репереендерите в завитушке Velit esse cillum dolore eu fugiat nulla pariatur. {T2} Excepteur sint occaecat cupidatat non proident, иск в виновнике, вызывающий беспокойство, моллит аним, то есть лейборист. Тест 4a Тест 4b Тест 4 c Lorem ipsum dolor sit amet, consitteur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

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

Lorem Ipsum Dolor Sit Amet, Concetetur Adipiscing Elit, Sed do EiusMod Tempor Inididunt U Labore et Dolore Magna Aliqua. Испытание 3a, Испытание 3b, Испытание 3 c Ut enim ad minim veniam, quis nostrud упражнение ullamco labouris nisi ut aliquip ex ea кассовый следствие. Испытание 1a, Испытание 1b, Испытание 1 c Duor aute irure dolor в репереендерите в завитке Velit esse cillum dolore eu fugiat nulla pariatur. Испытание 2a, Испытание 2b, Испытание 2 c Excepteur sint occaecat cupidatat, не проученный, иск в виновном, вызывающем беспокойство, мольит аним, то есть лейборист. Испытание 4a, Испытание 4b, Испытание 4 c Lorem ipsum dolor sit amet, consitteur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

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

1 Ответ

1 голос
/ 21 января 2020

Чтобы расширить мой комментарий. Поскольку 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

...