SQL用符号替换HTML实体编号/代码

时间:2018-10-12 08:47:26

标签: sql ms-access replace html-entities

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

T1:

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

如您所见,T1可能包含HTML实体编号/代码。


T2:

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

T2包含“所有”可能的数字/代码。


我想做的是替换“ 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的replace函数仅允许替换字符串,但是我找不到其他函数可以做到这一点。

1 个答案:

答案 0 :(得分:0)

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

您需要做的是多次更新表,每次更新都与T2不同。甚至更好的是,如果这些条目不是太多,则需要使用T2中的所有条目来构建自己的语句。

您可以构建这样的语句:

library(tidyverse)
for(i in 1:length(ls(pattern = "df"))){

    get(paste0("df", i)) %>% 
        select(-starts_with("FORMULA"), 
               (names(get(paste0("df", i))) %>% grep(pattern = "FORMULA", value = T))[!names(get(paste0("df", i))) %>% grep(pattern = "FORMULA", value = T)  %in% "FORMULA_TRANSFORM"]) 
    %>% print

}

返回哪个

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

sqlfiddle

要么使用它为动态sql生成一个字符串(了解有关此here的更多信息),要么仅构建一次,复制它并执行查询。您的查询将是

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