sql regex_replace в указанных столбцах из нескольких таблиц - PullRequest
0 голосов
/ 12 июня 2018

Как применить regex_replace к нескольким столбцам из нескольких таблиц?

У меня есть 2 таблицы «email» и «languageEmail», каждая из которых содержит столбцы «bodyText» и «bodyHtml».«Я хочу заменить все найденные ссылки в этих 4 столбцах той же самой ссылкой + новым параметром.

До сих пор я сделал регулярное выражение (POSIX), которое, кажется, соответствует всем моим ссылкам URL.

((http(s)?:\/\/)|(www\.))[a-zA-Z0-9@:%._\+~#=&\/?]{2,256}(\b|\s)

Я сделал SQL-запрос, который находит нужные столбцы.

SELECT 
  "email"."bodyText",
  "email"."bodyHtml",
  "languageEmail"."bodyText",
  "languageEmail"."bodyHtml"
FROM 
  "db"."email",
  "db"."languageEmail";

Я прочитал собственную документацию postgres, но примеров использования regex_replace в SQL-запросе нет, я посмотрел вДокументация оракулов, и у них есть несколько примеров чего-то похожего на то, чего я хочу достичь, но я не могу соединить точки сам и сделать это правильно.

Пример того, чего я хочу достичь:

languageEmail.bodyHtml с идентификатором 75 имеет значение:

<h1>hello world</h1> <a href="www.awsome.com/yes">click here</a>

languageEmail.bodyText с идентификатором 75имеет значение:

hello worldcplease visit www.awsome.com/yes

Я хочу добавить параметр & page = 1 ко всем ссылкам / URL

, поэтому после выполнения запроса с regex_replace languageEmail.bodyHtml с идентификатором 75 должен выглядеть следующим образом:

<h1>hello wordl</h1> <a href="www.awsome.com/yes&page=1">click here</a>

languageEmail.bodyText с идентификатором 75 должен выглядеть следующим образом:

hello worldcplease visit www.awsome.com/yes&page=1

1 Ответ

0 голосов
/ 12 июня 2018

Не могли бы вы заменить вторую кавычку и знак закрытия HTML '">' на '& page = 1">'?

Вы можете использовать его в выражении CASE WHEN

Например,:

CASE
  WHEN URL ~ '%((http(s)?:\/\/)|(www\.))[a-zA-Z0-9@:%._\+~#=&\/?]{2,256}(\b|\s)%'
   THEN
     REGEXP_REPLACE(URL, '(\">)', '&page=1">') END) AS URL_appended

Для вашего простого текста я бы попробовал что-то вроде конкатенации URL (всегда ли он в конце?) Со строкой, которая вам нужна в конце

Итак:

   SELECT
    CASE
    WHEN URL ~ '%((http(s)?:\/\/)|(www\.))[a-zA-Z0-9@:%._\+~#=&\/?]{2,256} 
      (\b|\s)%'
       THEN URL || '&page=1' END AS URL_appended
    FROM your_url_table)

Я думаю, что так и должно быть: D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...