SQL使用查找表替换长Case语句中搜索/替换字符串的硬编码



我有一个大表要更新以匹配字符串
当前实现使用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

最新更新