【问题标题】:SQL Substitute hard-coding of Search/Replace strings in long Case Statement by using a Lookup tableSQL 使用查找表替换长案例语句中搜索/替换字符串的硬编码
【发布时间】:2021-01-18 07:55:41
【问题描述】:

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

我想检查是否可以将搜索字符串保存在表中并与 Table1 页面字符串匹配,而不是在 case 语句中使用硬代码。

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

带有“chair XX”的页面字符串必须在检查“chair”之前匹配

【问题讨论】:

  • 您应该保留 CASE,您可能会根据 Table2 上的 Select 自动创建它。我使用 SQL UDF 实现了类似的 loopup-CASE,只要查找表上有插入/更新/删除,就会重新创建。
  • @dnoeth 嗨,我正在寻找在我的代码中不使用 UDF 的东西
  • 多久运行一次此更新?使用现有的CASE完全没有问题,它比其他任何东西都更有效。
  • @dnoeth 实际上这是一个更大的程序的一部分,该程序每天运行多次。我正在寻找一种不同的方式来添加或更新案例条件

标签: sql sql-update case teradata


【解决方案1】:

我了解 Teradata 具有与 DB2 类似的功能,同时支持正则表达式和 SQL MERGE 语句。在这种情况下,我使用您的示例表结构和数据here 创建了一个示例 DB2 fiddle。

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”的情况,您需要在搜索模式字段中使用特殊的正则表达式模式“chair (?!XX)”来识别“chair”后面没有“XX”的实例(因为您将在小提琴中看到)。与使用 LIKE/LIKE ANY 相比,使用正则表达式可以为您提供更多匹配模式的通用性。

编辑:将 DB2 语法 REGEXP_LIKE 与 Teradata 的等效 REGEXP_SIMILAR 交换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 2014-09-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    相关资源
    最近更新 更多