2016-10-17 19 views
0

DB2バージョン10.5を使用しています。私は、私がやろうとしている他のいくつかのクエリに影響を与えている悪いxmlデータを持つ少なくとも1つの行があることを知っているデータベーステーブルを持っています。行の1つに#x1A文字が含まれています。私はそれらに無効なxml文字[#x0E-#x1F]を持つすべての行を与えるクエリを実行する方法を見つけようとしています。以下は私が試したいくつかの試みですが、うまくいかないものです。16進数値のDB2クエリー

SELECT 
    e.EMLNAME 
FROM MYDB.EMPLOYEE e 
WHERE 
    -- [#x0E-#x1F] 
    /* 
    e.EMLNAME like '%#x0E%' 
    OR e.EMLNAME like '%#x0F%' 
    OR e.EMLNAME like '%#x10%' 
    OR e.EMLNAME like '%#x11%' 
    OR e.EMLNAME like '%#x12%' 
    OR e.EMLNAME like '%#x13%' 
    OR e.EMLNAME like '%#x14%' 
    OR e.EMLNAME like '%#x15%' 
    OR e.EMLNAME like '%#x16%' 
    OR e.EMLNAME like '%#x17%' 
    OR e.EMLNAME like '%#x18%' 
    OR e.EMLNAME like '%#x19%' 
    OR e.EMLNAME like '%#x1A%' 
    OR e.EMLNAME like '%#x1B%' 
    OR e.EMLNAME like '%#x1C%' 
    OR e.EMLNAME like '%#x1D%' 
    OR e.EMLNAME like '%#x1E%' 
    OR e.EMLNAME like '%#x1F%'; 

    e.EMLNAME like '%\x0E%' 
    OR e.EMLNAME like '%\x0F%' 
    OR e.EMLNAME like '%\x10%' 
    OR e.EMLNAME like '%\x11%' 
    OR e.EMLNAME like '%\x12%' 
    OR e.EMLNAME like '%\x13%' 
    OR e.EMLNAME like '%\x14%' 
    OR e.EMLNAME like '%\x15%' 
    OR e.EMLNAME like '%\x16%' 
    OR e.EMLNAME like '%\x17%' 
    OR e.EMLNAME like '%\x18%' 
    OR e.EMLNAME like '%\x19%' 
    OR e.EMLNAME like '%\x1A%' 
    OR e.EMLNAME like '%\x1B%' 
    OR e.EMLNAME like '%\x1C%' 
    OR e.EMLNAME like '%\x1D%' 
    OR e.EMLNAME like '%\x1E%' 
    OR e.EMLNAME like '%\x1F%'; 

    e.EMLNAME like '%\0x0E%' 
    OR e.EMLNAME like '%\0x0F%' 
    OR e.EMLNAME like '%\0x10%' 
    OR e.EMLNAME like '%\0x11%' 
    OR e.EMLNAME like '%\0x12%' 
    OR e.EMLNAME like '%\0x13%' 
    OR e.EMLNAME like '%\0x14%' 
    OR e.EMLNAME like '%\0x15%' 
    OR e.EMLNAME like '%\0x16%' 
    OR e.EMLNAME like '%\0x17%' 
    OR e.EMLNAME like '%\0x18%' 
    OR e.EMLNAME like '%\0x19%' 
    OR e.EMLNAME like '%\0x1A%' 
    OR e.EMLNAME like '%\0x1B%' 
    OR e.EMLNAME like '%\0x1C%' 
    OR e.EMLNAME like '%\0x1D%' 
    OR e.EMLNAME like '%\0x1E%' 
    OR e.EMLNAME like '%\0x1F%'; 
    */ 

    e.EMLNAME like '%0x0E%' 
    OR e.EMLNAME like '%0x0F%' 
    OR e.EMLNAME like '%0x10%' 
    OR e.EMLNAME like '%0x11%' 
    OR e.EMLNAME like '%0x12%' 
    OR e.EMLNAME like '%0x13%' 
    OR e.EMLNAME like '%0x14%' 
    OR e.EMLNAME like '%0x15%' 
    OR e.EMLNAME like '%0x16%' 
    OR e.EMLNAME like '%0x17%' 
    OR e.EMLNAME like '%0x18%' 
    OR e.EMLNAME like '%0x19%' 
    OR e.EMLNAME like '%0x1A%' 
    OR e.EMLNAME like '%0x1B%' 
    OR e.EMLNAME like '%0x1C%' 
    OR e.EMLNAME like '%0x1D%' 
    OR e.EMLNAME like '%0x1E%' 
    OR e.EMLNAME like '%0x1F%'; 

どのように16進値を問い合わせることができるかについての指針はありますか?私は範囲を行う方法を知らないので、個々の16進値を個別に実行しようとしました。範囲を実行する方法がある場合、これはさらに優れた解決策になります。

+0

最近のバージョンでは、単一の検索における文字の範囲(複数可)またはセット(S)を検索できるようになりREGEXP_LIKE()関数を持っています。 – WarrenT

+0

見つけたら何をするつもりですか? '単にMYDB.EMPLOYEE set e.EMLNAME = translate(e.EMLNAME、 ''、x'1a ')'を更新するだけでいいですか? – mustaccio

+0

@mustaccio、悪いデータを示すレポートを作成する予定です。私の推測では、ビジネスは最終的に悪い文字が ''の代わりに削除されることを望んでいるということです。 –

答えて

1

だから私は仕事に次しまっ:

SELECT 
    e.EMLNAME 
FROM MYDB.EMPLOYEE e 
WHERE 
    e.EMLNAME like CONCAT(CONCAT('%', x'0E'), '%') 
    OR e.EMLNAME like CONCAT(CONCAT('%', x'0F'), '%') 
    OR e.EMLNAME like CONCAT(CONCAT('%', x'10'), '%') 
    OR e.EMLNAME like CONCAT(CONCAT('%', x'11'), '%') 
    OR e.EMLNAME like CONCAT(CONCAT('%', x'12'), '%') 
    OR e.EMLNAME like CONCAT(CONCAT('%', x'13'), '%') 
    OR e.EMLNAME like CONCAT(CONCAT('%', x'14'), '%') 
    OR e.EMLNAME like CONCAT(CONCAT('%', x'15'), '%') 
    OR e.EMLNAME like CONCAT(CONCAT('%', x'16'), '%') 
    OR e.EMLNAME like CONCAT(CONCAT('%', x'17'), '%') 
    OR e.EMLNAME like CONCAT(CONCAT('%', x'18'), '%') 
    OR e.EMLNAME like CONCAT(CONCAT('%', x'19'), '%') 
    OR e.EMLNAME like CONCAT(CONCAT('%', x'1A'), '%') 
    OR e.EMLNAME like CONCAT(CONCAT('%', x'1B'), '%') 
    OR e.EMLNAME like CONCAT(CONCAT('%', x'1C'), '%') 
    OR e.EMLNAME like CONCAT(CONCAT('%', x'1D'), '%') 
    OR e.EMLNAME like CONCAT(CONCAT('%', x'1E'), '%') 
    OR e.EMLNAME like CONCAT(CONCAT('%', x'1F'), '%'); 

は答えを投稿、他の人が私が探しているかのアイデアを持っているので。私はしばらく待って、誰かがきれいな解決策を思いつくかどうかを見てみましょう。もしそうなら、それを答えとして受け入れる。 DB2の

1

毒の小さな変化

SELECT e.EMLNAME FROM MYDB.EMPLOYEE e 
    WHERE 
    e.EMLNAME like '%' || x'0E' || '%' 
    OR e.EMLNAME like '%' || x'0F' || '%' 
    OR e.EMLNAME like '%' || x'10' || '%' 
    OR e.EMLNAME like '%' || x'11' || '%' 
    OR e.EMLNAME like '%' || x'12' || '%' 
    OR e.EMLNAME like '%' || x'13' || '%' 
    OR e.EMLNAME like '%' || x'14' || '%' 
    OR e.EMLNAME like '%' || x'15' || '%' 
    OR e.EMLNAME like '%' || x'16' || '%' 
    OR e.EMLNAME like '%' || x'17' || '%' 
    OR e.EMLNAME like '%' || x'18' || '%' 
    OR e.EMLNAME like '%' || x'19' || '%' 
    OR e.EMLNAME like '%' || x'1A' || '%' 
    OR e.EMLNAME like '%' || x'1B' || '%' 
    OR e.EMLNAME like '%' || x'1C' || '%' 
    OR e.EMLNAME like '%' || x'1D' || '%' 
    OR e.EMLNAME like '%' || x'1E' || '%' 
    OR e.EMLNAME like '%' || x'1F' || '%'; 
+1

クリーナーコンスタットのバージョン、thx。私は、誰もが明示的に各項目をリストする必要がなく、範囲を行う方法を見つけるかどうかを待つつもりです。 –