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, '™','™'),'®','®'),'©','©')
要么使用它为动态 sql 构建一个字符串(阅读更多关于这个 here 的信息),要么您只构建一次,复制它并执行您的查询。您的查询是
update T1 set
Short = replace(replace(replace(T1.Short, '™','™'),'®','®'),'©','©'),
Long = replace(replace(replace(T1.Long, '™','™'),'®','®'),'©','©');
有两个源表。 一个包含产品数据(包括产品的简短和详细描述),另一个包含 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, '™','™'),'®','®'),'©','©')
要么使用它为动态 sql 构建一个字符串(阅读更多关于这个 here 的信息),要么您只构建一次,复制它并执行您的查询。您的查询是
update T1 set
Short = replace(replace(replace(T1.Short, '™','™'),'®','®'),'©','©'),
Long = replace(replace(replace(T1.Long, '™','™'),'®','®'),'©','©');