SQL заменяет номер / код объекта HTML символом - PullRequest
0 голосов
/ 12 октября 2018

Есть две исходные таблицы.Один содержит данные о продукте (включая краткое и полное описание продукта), а другой содержит номера / коды объектов HTML и эквивалентный ему символ.

T1:

 ID |          Short          |        Long
------------------------------------------------------
001 | Captain's Shield™ | Cool item©
002 | Someones's Hammer®  | Even cooler item©

Как вы можете видеть, T1может содержать номера / коды объектов HTML.


T2:

  HTML  | Symbol 
----------------------------------
™ |  ™
®   |  ®
©  |  ©

T2 содержит «все» возможные числа / коды.


Что я хотел бы сделать, это заменить все вхождения таких сущностей в столбцах «Короткий» и «Длинный».

Результат должен выглядеть следующим образом:

 ID |          Short          |        Long
------------------------------------------------------
001 |    Captain's Shield™    | Cool item©
002 |    Someones's Hammer®   | Even cooler item©

Вот пример кода, который я пробовал и не смог заставить его работать должным образом:

UPDATE T1, T2
SET 
T1.Short = replace(T1.Short, T2.HTML, T2.Symbol), 
T1.Long = replace(T1.Long, T2.HTML, T2.Symbol)
WHERE UseRegExp(T1.Short, "^.*&((#[0-9]{1,5})|[a-zA-Z]{1,10});.*$")<>"" Or UseRegExp(T1.Long, "^.*&((#[0-9]{1,5})|[a-zA-Z]{1,10});.*$")<>"";

Я знаю, что функция замены SQL позволяет заменять только строки, но я не смогчтобы найти любую другую функцию для этого.

1 Ответ

0 голосов
/ 12 октября 2018

Ваш подход не работает, потому что результат записывается фактически в конце оператора, а не после обработки каждой строки.Таким образом, каждый раз при обработке строки заменяется только символ, присоединенный к этой строке.В следующей строке исходная строка снова берется в качестве источника, а замена из предыдущей строки забывается, поэтому вы фактически никогда не заменяете все символы.

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

Вы можете создать такое утверждение, как это:

select concat(
  repeat('replace(', count(*))
  , 't1.Short, '
  , group_concat(concat('\'', HTML, '\',\'', Symbol, '\')'))
  )
from t2;

, которое возвращает

replace(replace(replace(t1.Short, '&trade;','™'),'&reg;','®'),'&copy;','©')

( sqlfiddle )

Либо используйте это для построения строки для динамического sql (подробнее об этом здесь ), либо простособерите его один раз, скопируйте и выполните ваш запрос.Ваш запрос будет

update T1 set 
Short = replace(replace(replace(T1.Short, '&trade;','™'),'&reg;','®'),'&copy;','©'),
Long = replace(replace(replace(T1.Long, '&trade;','™'),'&reg;','®'),'&copy;','©');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...