Элементы фильтра SQL из списка - PullRequest
0 голосов
/ 03 ноября 2010

Мне нужно отфильтровать строки в таблице SQL, в которой есть значения в одном столбце, которые находятся в указанном списке значений.Упрощенная таблица выглядит примерно так: (извините за плохое форматирование, здесь никогда раньше не публиковалось)

Error Codes     | Other Column 1 | Other Column 2 ...

--------------------------------------------------
F010,F123,F345, |  ......        | .....

F231,FC85,F904, |  ......        | .....

FC432,F0425,NA, |  ......        | .....

 ....

Сначала я разделил столбец Коды ошибок, чтобы получить каждый из 3 кодов ошибок, представляющих собой строку, разделенную запятой.ценностей.Затем мне нужно отфильтровать строки со всеми тремя кодами ошибок в данном списке, например («F010», «FC542», «FB943»).Я выполняю это в базе данных Teradata, это часть запроса, но, похоже, не отфильтровываются все комбинации в списке:

SELECT ... , 

CASE
WHEN ( substr(a.error_code, 1, position(',' in a.error_code)-1) in ('F010', 'FC542', 'FB012' 'FB943', 'NA')

AND substr(a.error_code,
              position(',' in a.error_code)+1, 
              position(',' in substr(a.error_code,  position(',' in a.error_code)+1, Characters(a.error_code)-position(',' in a.error_code)))-1) in ('F010', 'FC542', 'FB012' 'FB943', 'NA')

AND substr(a.error_code,
          position(',' in a.error_code) + position(',' in substr(a.error_code,    position(',' in a.error_code)+1, Characters(a.error_code)-position(',' in a.error_code)))+1,
          Characters(a.error_code)-(position(',' in a.error_code) + position(',' in substr(a.error_code,  position(',' in a.error_code)+1, Characters(a.error_code)-position(',' in a.error_code))))-1) in ('F010', 'FC542', 'FB012' 'FB943', 'NA') )

THEN 'No'

ELSE 'Yes'

end Error_Module,

...
FROM Error_code_table a

WHERE Error_Module = 'Yes'

В качестве стороны, функция Characters ()так же, как длина ().

Спасибо, Майк

Ответы [ 2 ]

1 голос
/ 03 ноября 2010

Наличие нескольких значений в списке через запятую, содержащемся в одном столбце, значительно усложняет задачу. Эта задача была бы намного проще, если бы ее можно было переработать так, чтобы в строке был только один код ошибки.

Я не знаком с Teradata, но, глядя на Google, кажется, что они разбираются в аналитике и бизнес-аналитике. Таким образом, я надеюсь, что у них есть некоторые функции регулярных выражений, и я думаю, что это было бы хорошим местом для вас, чтобы начать искать. Например, в Oracle я бы сделал что-то вроде следующего, чтобы извлечь коды ошибок из строки:

SELECT TRIM(REGEXP_REPLACE(ERROR_CODES, '(.*),.*,.*', '\1')),
       TRIM(REGEXP_REPLACE(ERROR_CODES, '.*,(.*),.*', '\1')),
       TRIM(REGEXP_REPLACE(ERROR_CODES, '.*,.*,(.*)', '\1'))
  INTO strErr1, strErr2, strErr3
  FROM DUAL;

Удачи.

0 голосов
/ 05 ноября 2010

Если код ошибки не появляется в начале списка, он всегда будет отображаться в виде ,<error code>,.

SELECT
    CASE
        WHEN substr(a.error_code, 1, position(',' in a.error_code) - 1) in ('F010', 'FC542', 'FB012', 'FB943', 'NA')
            OR a.error_code LIKE ANY ('%,F010,%', '%,FC542,%', '%,FB012,%', '%,FB943,%', '%,NA,%')
        THEN 'No'
        ELSE 'Yes'
    End Error_Module
FROM Error_code_table a
WHERE Error_Module = 'Yes';
...