Redshift regexp_replace

#amazon-redshift #regexp-replace

#amazon-redshift #регулярное выражение-заменить

Вопрос:

У меня есть строка типа: ‘запустите строку {замените это}, продолжите строку {замените это тоже} и для хорошей оценки, продолжите строку еще немного’ Мне нужен результат, который будет: ‘запустите строку %, продолжите строку % и для хорошей оценки, продолжите строку еще немного’

Я пытаюсь заменить любое / все вхождения открытых / закрытых волнистых скобок на % для использования в динамической инструкции SQL с использованием оператора like.

Ответ №1:

Чтобы заменить {replace this} подобные строки на % , вы можете использовать функцию замены регулярного выражения, подобную этой:

 with input(txt) as (
    select 'start the string {replace this} continue the string {replace this too} and for good measure, continue the string some more'::varchar
)
select regexp_replace(txt, '\{[\w\s]*\}', '%') from input;
  

ВОЗВРАТ

start the string % continue the string % and for good measure, continue the string some more


Но вместо того, чтобы выполнять описанный 2-шаговый поиск, где вы сначала заменяете все части шаблона на % , а затем выполняете LIKE поверх этого, почему бы просто не выполнить поиск по регулярному выражению?

 with input(txt) as (
    select 'start the string {replace this} continue the string {replace this too} and for good measure, continue the string some more'::varchar
)
select txt from input
where
txt ~ 'start the string \{.*\} continue the string \{.*\} and for good measure, continue the string some more'
 
  

Комментарии:

1. большое вам спасибо, ботчняк, это выглядит интересно, но мне трудно применить это к деталям моей проблемы, поэтому вот еще немного. У меня есть таблица FOO, в которой есть текст «Спасибо, Билли, за покупку цветов на 20202/01/01», в строке таблицы у меня есть текстовый шаблон с template_id 1 и «Спасибо {firstname} за покупку {item} на {date}», и мне нужно, чтобы текст из FOO мог присоединиться к строке и получить template_id 1. Не уверен, что я только что сделал это более запутанным, но позвольте мне поработать с вашим предложением, опять же, очень признателен!

2. Я смог воспользоваться вашим руководством и применить его к своему варианту использования и заставить его работать, большое спасибо, я опубликую решение, как только немного почищу!

3. Если ответ был полезным, вы можете считать, что маркировка является принятой 🙂