我需要过滤掉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()相同。
谢谢, 麦克
答案 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';