1

指定された値のリストにある 1 つの列に値を持つ SQL テーブル内の行を除外する必要があります。単純化された表は次のようになります:

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

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

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

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

 ....

まず、[エラー コード] 列を分割して、3 つのエラー コードのそれぞれを取得します。これは、コンマで区切られた値の文字列です。次に、('F010'、'FC542'、'FB943') などの特定のリスト内の 3 つのエラー コードすべてを含む行を除外する必要があります。これを 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() と同じです。

ありがとう、マイク

4

2 に答える 2

1

1つの列に含まれるコンマ区切りのリストに複数の値があると、これははるかに困難になります。行ごとにエラーコードが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;

幸運を。

于 2010-11-03T11:25:51.390 に答える
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';
于 2010-11-04T23:09:04.743 に答える