如何检查字符串是否与包含多个相似模式的字符串中的特定相似模式匹配

时间:2019-02-12 06:21:09

标签: sql database teradata teradata-sql-assistant

我在TERADATA中有一个场景,例如

表1-col1-'XYZ1234'

包含多个模式的表就像 表2-col1-'XY12%,XYZ%,ABC℅'

注意:以上值是单个Row的特定列中的完整字符串。

所以在这里,如果需要在这里做类似的事情

像任何(Table2.col1)= true(1)一样的Table1.Col1。 按照上述方案,表1 col1的值XYZ1234应该与表2 col1 XYZ%的第二个模式匹配,这是正确的。

任何人都可以在这种情况下为我提供帮助。

2 个答案:

答案 0 :(得分:1)

我建议在第二张表中保留以下内容:

col1
XY12
XYZ
ABC

然后,您可以按以下方式构建动态LIKE表达式:

SELECT t1.Col1
FROM table1 t1
INNER JOIN table2 t2
    ON t1.Col1 LIKE t2.Col1 || '%';

我建议不要在表中存储通配符%,因为它是冗余信息,也不是实际数据的一部分。

请注意,如果第一个表中的每个Col1值可能有多个匹配项,那么我的联接可能会返回重复项。使用SELECT DISTINCT将是解决此问题的一种方法。

答案 1 :(得分:0)

Teradata实际上支持col1 like any (select col1 from ...),但是您需要对输入数据进行规范化。如果您无法按照Tim的建议存储数据,则可以使用表函数StrTok_Split_To_Table快速进行:

WITH cte AS 
  ( 
    SELECT 1 AS inkey -- needed as input for the table function, can be a column
      ,col1 FROM t2
  )
SELECT * FROM t1
WHERE col1 LIKE ANY 
 (
   SELECT trim(token) -- to remove leading spaces (could be done also using both ' ,' as split character)
   FROM TABLE (StrTok_Split_To_Table(cte.inkey, cte.col1, ',' )
               RETURNS (outkey INTEGER,
                        tokennum INTEGER,
                        token VARCHAR(40) CHARACTER SET Unicode)
              ) AS d 
 )