SQL 用符号替换 HTML 实体 number/code

SQL replace HTML entity number/code with symbol

有两个源表。 一个包含产品数据(包括产品的简短和详细描述),另一个包含 HTML 实体 numbers/codes 及其等效符号。

T1:

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

如您所见,T1 可能包含 HTML 实体 numbers/codes。


T2:

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

T2 包含 "all" 个可能 numbers/codes。


我想做的是替换 "Short" 和 "Long".

列中出现的所有此类实体

结果应如下所示:

 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 的替换函数只允许替换字符串,但我找不到任何其他函数来执行此操作。

你的方法行不通,因为结果实际上是写在语句的末尾,而不是在处理完每一行之后。这样,每次处理一行时,仅替换连接到该行的符号。在下一行中,原始行再次作为源,而忘记了上一行的替换,因此您实际上永远不会替换所有符号。

您需要做的是多次更新 table,每次使用与 T2 不同的行。或者甚至更好,如果 T2 中的所有条目不是​​太多,您需要为自己构建一个语句。

您可以像这样构建这样的语句:

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

哪个returns

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

(sqlfiddle)

要么使用它为动态 sql 构建一个字符串(阅读更多关于这个 here 的信息),要么您只构建一次,复制它并执行您的查询。您的查询是

update T1 set 
Short = replace(replace(replace(T1.Short, '&trade;','™'),'&reg;','®'),'&copy;','©'),
Long = replace(replace(replace(T1.Long, '&trade;','™'),'&reg;','®'),'&copy;','©');