SQL筛选列表中的项目

时间:2010-11-03 02:16:48

标签: sql mysql list filter teradata

我需要过滤掉SQL表中的行,这些行在一列中具有指定值列表中的值。简化表看起来像:(抱歉格式错误,以前从未在此处发布)

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

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

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

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

 ....

我首先拆分错误代码列以获取3个错误代码中的每一个,这是一个以逗号分隔的值字符串。然后我需要过滤掉给定列表中所有三个错误代码的行,例如('F010','FC542','FB943')。我在Teradata DB上运行它,这是查询的一部分,但似乎没有过滤掉列表中的所有组合:

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()函数与Length()相同。

谢谢, 麦克

2 个答案:

答案 0 :(得分:1)

在包含在单个列中的逗号分隔列表中包含多个值会使这更加困难。如果可以重做这项任务会更容易,因此每行只有一个错误代码。

我对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;
祝你好运。

答案 1 :(得分:0)

如果错误代码没有出现在列表的开头,它将始终以 ,<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';