我写了以下查询:
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
中以从中检索)
如果你只是在寻找子串,你可以使用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
你可以试试REGEXP_LIKE
。例如。
SELECT DISTINCT
TABNAME
FROM
SYSCAT.TABLES
WHERE
TYPE='T'
AND REGEXP_LIKE(TABNAME,'.*_((ABS)|(ACCT))_.*')
以防万一。
请注意,'_'字符在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 '\'
);