teradata中是否有方法替换另一个表中一行中的多个字符串?
我有两张表teradata中是否有方法替换另一个表中一行中的多个字符串?,teradata,Teradata,我有两张表Customer和Road\u AB 客户表数据: id Add 1 India NW 2 Poland NW HV 3 ASIA HV id Add 1 India NEW 2 Poland NEW Heaven 3 ASIA Heaven 道路交通数据: text abb NW NEW HV Heaven 我的要求是从Road\u AB对Customer表执行更新。 一行中可能有多个字符串需要更新 更新后的预期结果: 客户表格数据: id Add 1 I
Customer
和Road\u AB
客户表数据:
id Add
1 India NW
2 Poland NW HV
3 ASIA HV
id Add
1 India NEW
2 Poland NEW Heaven
3 ASIA Heaven
道路交通数据:
text abb
NW NEW
HV Heaven
我的要求是从Road\u AB
对Customer
表执行更新。
一行中可能有多个字符串需要更新
更新后的预期结果:
客户
表格数据:
id Add
1 India NW
2 Poland NW HV
3 ASIA HV
id Add
1 India NEW
2 Poland NEW Heaven
3 ASIA Heaven
这里棘手的部分是,您必须将列的任意子字符串连接到
Road_ab
表,这无疑会引起各种各样的麻烦。谢天谢地,Teradata有这个很棒的strtok_split_to_table
函数,它允许您将记录中的一列拆分为分隔符上的多个记录。因此,我们可以将India NW
拆分为两个记录India
和NW
在空格
字符上拆分。然后我们可以连接并使用XMLAGG()
将这些拆分的字符串重新连接在一起。这些函数允许我们在整个过程中保持顺序并记录密钥
以下是使用示例数据的工作示例:
CREATE MULTISET VOLATILE TABLE Customer(
id INTEGER
,Addf VARCHAR(30) NOT NULL
) ON COMMIT PRESERVE ROWS;
INSERT INTO Customer(id,Addf) VALUES (1,'India NW');
INSERT INTO Customer(id,Addf) VALUES (2,'Poland NW HV');
INSERT INTO Customer(id,Addf) VALUES (3,'ASIA HV');
CREATE MULTISET VOLATILE TABLE Road_AB(
textf CHAR(2)
,abb VARCHAR(30) NOT NULL
) ON COMMIT PRESERVE ROWS;
INSERT INTO Road_AB(textf,abb) VALUES ('NW','NEW');
INSERT INTO Road_AB(textf,abb) VALUES ('HV','Heaven');
SELECT splitCustomer."id", TRIM(TRAILING ',' FROM (XMLAGG(TRIM(COALESCE(road_ab.abb, splitCustomer.token))|| '' ORDER BY splitCustomer.TokenNum) (VARCHAR(10000), CHARACTER SET UNICODE)))
FROM
(
SELECT *
FROM TABLE (STRTOK_SPLIT_TO_TABLE(customer.id, customer.addf, ' ')
RETURNS (id integer
,tokennum INTEGER
,token VARCHAR(30) CHARACTER SET UNICODE)
) AS dt
) splitCustomer
LEFT OUTER JOIN road_ab
ON trim(splitCustomer.token) = trim(road_ab.textf)
GROUP BY 1;
DROP TABLE customer;
DROP TABLE Road_ab;
+----+-------------------+
| id | add |
+----+-------------------+
| 3 | ASIA Heaven |
| 2 | Poland NEW Heaven |
| 1 | India NEW |
+----+-------------------+
值得注意的是,如果你有大量数据,这不会很快。您的索引在这里没有帮助,因为我们必须生成一个比源数据大很多倍的临时结果集,将其连接到您的road_ab
表,然后经历字符串聚合的痛苦
还值得注意的是,如果
Customer
中的Add
列大小不合适,则此操作可能会失败。看起来您正在用较大的单词替换较小的单词,如果这些单词超出了列的大小,那么基于此选择的插入将失败 感谢@jnevil提供的解决方案。我尝试了此解决方案,但外部选择出错。它给我的错误是“错误代码6706:字符串包含一个不可翻译的字符。”我假设这里有一个unicode列。我已经更新了XMLAGG来处理unicode。