Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
teradata中是否有方法替换另一个表中一行中的多个字符串?_Teradata - Fatal编程技术网

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。