DB2 эффективный запрос выбора с оператором like для многих значений (~ 200) - PullRequest
0 голосов
/ 15 февраля 2019

Я написал следующий запрос:

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

Это дает мне определенное количество результатов.Теперь проблема в том, что у меня есть несколько TABNAME для выбора с помощью оператора LIKE (~ 200). Существует ли эффективный способ написать запрос для 200 значений без повторения TABNAME LIKE part (поскольку существует 200 таких значений, которые могут привести к действительно огромному запросу)?

(Если это поможет, я сохранил все необходимые TABNAME значения в таблице TS для извлечения из нее)

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Если вы просто ищете подстроки, вы можете использовать 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 голосов
/ 15 февраля 2019

На всякий случай.
Обратите внимание, что символ '_' имеет особое значение в pattern-expression предиката LIKE :

  • Theсимвол подчеркивания (_) представляет любой отдельный символ.
  • Знак процента (%) представляет строку из нуля или более символов.
  • Любой другой символ представляет себя.

Итак, если вы действительнонужно найти _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 '\'
);
0 голосов
/ 15 февраля 2019

Вы можете попробовать REGEXP_LIKE.Например,

SELECT DISTINCT
    TABNAME
FROM
    SYSCAT.TABLES
WHERE
    TYPE='T' 
AND REGEXP_LIKE(TABNAME,'.*_((ABS)|(ACCT))_.*')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...