我有一个大表要更新以匹配字符串
当前实现使用case语句来匹配case中硬编码的多个字符串。
Sample table:
Table1:
pagestring varchar(200),
subclass varchar(50),
update Table1
set subclass = case
when pagestring LIKE ANY ('index%','Store/%') THEN 'Home'
WHEN pagestring LIKE 'chair XX%' THEN 'chairXX'
WHEN pagestring LIKE 'chair %' THEN 'chair'
WHEN pagestring LIKE ANY ('account%','order%') THEN 'order'
WHEN pagestring LIKE 'home/shop%' THEN 'shop'
WHEN pagestring LIKE 'chairleather%' THEN 'chairleather'
WHEN pagestring LIKE ANY('lamp%','light%') THEN 'light'
end
与case语句中的硬代码不同,我想检查搜索字符串是否可以保存在表中并与Table1页面字符串匹配。
Table2
seq byteint,
searchstring varchar(100),
searchlength integer,
subclass varchar(50)
seq searchstring searchlength subclass
--- -------------- ------------ -----------
1 index 5 Home
2 Store 5 Home
3 chair XX 8 chairXX
4 chair 5 chair
5 account 7 order
6 order 5 order
7 home/shop 9 shop
8 chairleather 12 chairleather
9 lamp 4 light
10 light 5 light
在检查"椅子"之前,带有"椅子XX"的页面字符串必须匹配
我知道Teradata具有与DB2类似的功能,同时支持正则表达式和SQL MERGE语句。在这种情况下,我在这里使用示例表结构和数据创建了一个示例DB2fiddle。
MERGE INTO table1 AS tgt
USING (SELECT pagestring,
t2.subclass
FROM table1 T1,
table2 T2
WHERE REGEXP_SIMILAR(pagestring, searchstring)) AS src
ON src.pagestring = tgt.pagestring
WHEN MATCHED THEN
UPDATE SET tgt.subclass = src.subclass
对于"chair XX"与"chair"的情况,您需要在searchpattern字段中使用一个特殊的正则表达式模式"chair(?!XX("来识别后面没有跟"XX"的"chair"实例(如您将在fiddle中看到的(。与使用LIKE/LIKE ANY相比,使用正则表达式将在匹配模式方面提供更多的灵活性。
EDIT:用Teradata的等效REGEXP_SIMILAR
交换DB2语法REGEXP_LIKE
。