具有类似运算符的DB2高效选择查询,用于许多值(〜200)

时间:2019-02-15 09:14:22

标签: sql db2

我写了以下查询:

SELECT TBSPACE FROM SYSCAT.TABLES WHERE TYPE='T' AND (TABNAME LIKE '%_ABS_%' OR TABNAME LIKE '%_ACCT_%')

这给了我一定数量的结果。现在的问题是,我有多个TABNAME使用LIKE运算符来选择(〜200)。 是否有一种有效的方式来编写200个值的查询而无需重复TABNAME LIKE部分(因为有200个这样的值会导致非常大的查询)?

(如果有帮助,我已将所有必需的TABNAME值存储在表TS中以进行检索)

3 个答案:

答案 0 :(得分:1)

如果您只是在寻找子字符串,则可以使用LOCATE。例如

WITH SS(S) AS (
    VALUES
        ('_ABS_')
    ,   ('_ACCT_')
)
SELECT DISTINCT
    TABNAME
FROM
    SYSCAT.TABLES, SS
WHERE
    TYPE='T' 
AND LOCATE(S,TABNAME) > 0

或者如果您的子字符串在表CREATE TABLE TS(S VARCHAR(64))

SELECT DISTINCT
    TABNAME
FROM
    SYSCAT.TABLES, TS
WHERE
    TYPE='T' 
AND LOCATE(S,TABNAME) > 0

答案 1 :(得分:0)

您可以尝试REGEXP_LIKE。例如

SELECT DISTINCT
    TABNAME
FROM
    SYSCAT.TABLES
WHERE
    TYPE='T' 
AND REGEXP_LIKE(TABNAME,'.*_((ABS)|(ACCT))_.*')

答案 2 :(得分:0)

以防万一。
请注意,{_ 3}}谓词的sudo ln -s locationOfLibFromAboveCommand locationItShouldBe 中的'_'字符具有特殊含义:

  
      
  • 下划线字符(_)表示任何单个字符。
  •   
  • 百分号(%)表示一个零个或多个字符的字符串。
  •   
  • 其他任何字符都代表自己。
  •   

因此,如果您确实需要找到pattern-expression子字符串,则应使用类似下面的内容。
如果您改用注释掉的模式,则可能会在结果中得到两行。

_ABS_
相关问题