有两个源表。 一个包含产品数据(包括产品的简短描述),另一个包含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函数仅允许替换字符串,但是我找不到其他函数可以做到这一点。
答案 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;
要么使用它为动态sql生成一个字符串(了解有关此here的更多信息),要么仅构建一次,复制它并执行查询。您的查询将是
replace(replace(replace(t1.Short, '™','™'),'®','®'),'©','©')