用于许多值的DB2运算符的DB2高效选择查询(~200)

问题描述 投票:0回答:3

我写了以下查询:

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中以从中检索)

sql db2
3个回答
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

0
投票

你可以试试REGEXP_LIKE。例如。

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

0
投票

以防万一。 请注意,'_'字符在pattern-expression谓词的LIKE中具有特殊含义:

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

所以,如果你真的需要找到_ABS_子串,你应该使用类似下面的东西。 如果您使用注释掉的模式,则在结果中获得两行,这可能是不合需要的。

with 
  pattern (str) as (values
  '%\_ABS\_%'
--'%_ABS_%'
)
, tables (tabname) as (values
  'A*ABS*A'
, 'A_ABS_A'
)
select tabname
from tables t
where exists (
  select 1
  from pattern p
  where t.tabname like p.str escape '\'
);
© www.soinside.com 2019 - 2024. All rights reserved.