質問
私はこのような私のSQLの句の句のいくつかのcharデータを比較しています、
ここで、pri_code <pricode
私が抱えている問題は、char値が長さが異なる場合です。したがって、pri_code = '0800'およびpricode = '20'の場合、falseの代わりにtrueを返します。
このように比較しているようです
'08' < '20'
好きではなく
'0800' < '20'
CHAR比較は、左から一方の値が終了するまで始まりますか?
もしそうなら、これを修正するにはどうすればよいですか?
私の値には文字が含まれる可能性があるため、数値に収束することはオプションではありません。
解決
「08」を「20」と比較するのではなく、予想どおり「0800」を「20」と比較しています。
しかし、あなたが期待していないように見えるのは、「0800」(文字列)が 確かに 「20」未満(文字列)。
数値比較のためにそれを数値に変換することが問題外である場合、次のDB2関数を使用できます。
right ('0000000000'||val,10)
それはあなたに与えるでしょう val
左にパッド入り、ゼロは10のサイズまでです(に最適 CHAR(10)
, 、 例えば)。これにより、少なくともフィールドが同じサイズであり、比較が特定のケースで機能することを保証します。しかし、私はあなたがあなたが物事をどのようにしているかを再考することをお勧めします:パフォーマンスのように、列あたりの機能はめったにスケーリングされることはありません。
z/osを使用している場合は、コンピュータールームの床に横たわっているだけで、作業を待っている必要があります。おそらく、特定のアプリケーションに合わせたアドバイスを求めることができます:-)
挿入/更新トリガーとセカンダリ列の使用で思い浮かぶことの1つ PRI_CODE_PADDED
を保持する PRI_CODE
完全にパッドアウトされた列(上記と同じ方法を使用)。次に、あなたを確認してください PriCode
変数は、実行する前に同様にフォーマットされます select ... where PR_CODE_PADDED < PriCode
.
挿入/更新時間でそのコストが発生すると、あなたが行う可能性のあるすべての選択にわたってそれを償却するでしょう(これは、彼らがもはやrow関数を使用していないため、目がくらむほど速くなります)。もちろん、データベースは、読んだ以上のものが書かれている非常に珍しい獣の1つではありません)。