0

DB2 for IBM i V6R1を使用していますが、数値の有効な表現が含まれることがある文字列値を数値に変換しようとしています。私が思いついたのはこれでした:

select onorno, onivrf, coalesce(cast(substr(onivrf,1,5) as numeric),99999) as fred
from oinvol

ONIVRFフィールドに「00111-11」のようなデータがある場合もあれば、「FREIGHT」のようなデータがある場合もあります。

ドキュメントは、次のようなデータについては次のように信じています。

ONORNO ONIVRF
12     11010-11
13     FREIGHT
14     00125-22

次のような出力が得られるはずです。

ONORNO ONIVRF    FRED
12     11010-11  11010
13     FREIGHT   99999
14     00125-22  125

代わりに、私はこれを取得しています:

ONORNO ONIVRF    FRED
12     11010-11  11010
13     FREIGHT   NULL
14     00125-22  125

(をスキップしてcoalesce()を使用するとCast(substr(onivrf(1,5) as numeric)、まったく同じ結果が得られます。)

私はここで何が間違っているのですか?

4

1 に答える 1

2

すべてアルファベット文字であるsを削除しようとしている場合はONIVRF、次のようにすることができます。

SELECT ONORNO, ONIVRF, 
    CASE 
        WHEN UCASE(SUBSTR(ONIVRF,1,5)) = LCASE(SUBSTR(ONIVRF,1,5)) THEN CAST(SUBSTR(ONIVRF,1,5) AS NUMERIC)
        ELSE 99999
    END AS fred
FROM OINVOL

ISNUMERIC()DB2には同等のものがないため、少しハックです。ただし、大文字と小文字の関数によって変換されるのは英字だけです。

これをDB2forz / OS(v9)でテストしたところ、機能しましたが、DB2foriSeriesがまったく同じかどうかはわかりません。私の場合、@ Joe Stefanelliが言ったように、アルファベットの文字列をにキャストしようとするとエラーが発生しましたNUMERIC

編集:

これはうまくいくかもしれません(ONIVRFすべてチルダであるsがないことを前提としています)。@ X-Zeroが、英語以外の言語の一部の文字に小文字と大文字がない場合に言及しているという問題はないはずです。

SELECT ONORNO, ONIVRF,
    CASE
        WHEN TRANSLATE(ONIVRF, '~~~~~~~~~~~', '0123456789-') = '~~~~~~~~' THEN CAST(SUBSTR(ONIVRF,1,5) AS NUMERIC)
        ELSE 99999
    END AS fred
FROM OINVOL
于 2011-12-15T22:47:02.517 に答える