私が持っている文字が数字であるかどうかを確認する組み込みのDB2関数またはクエリはありますか? (ユーザー定義関数を使用できません)
CASE
WHEN LENGTH(RTRIM(TRANSLATE(test_str, '*', ' 0123456789'))) = 0
THEN 'All digits'
ELSE 'No'
END
多くのアプローチがあります。次の2つの関数のみを使用して、そのソリューションを見てください。
CASE
WHEN REPLACE(TRANSLATE(test_str, '0','123456789','0'),'0','') = ''
THEN 'All digits'
ELSE 'Not all digits'
END
一般的に-機能が少ない-パフォーマンスが向上します:)
db2のバージョンがregexp_likeを使用できる場合は、次のようにします。
「。」付きの番号小数点記号として:
select * from yourtable
where REGEXP_LIKE(trim(yourzone) , '^\d+(\.\d*)?$')
小数点記号として「、」を含む番号:
select * from yourtable
where REGEXP_LIKE(trim(yourzone) , '^\d+(\,\d*)?$')
小数点記号なしの数値(整数のみ、ask)
select * from yourtable
where REGEXP_LIKE(trim(yourzone) , '^\d+$')
XQbertが公開したアイデアに基づいて、エラーが発生しやすいバージョンを作成し、中間結果を追加し、いくつかの例と、文字列値を安全に整数に変換するto_integer列を追加しました。
select
test_str
, TRIM(TRANSLATE(replace(trim(test_str), ' ', 'x'), ' ', '0123456789'))
, case when length(TRIM(TRANSLATE(replace(trim(test_str), ' ', 'x'), ' ', '0123456789')))=0
then cast(test_str as int) else null end to_integer
, case when length(TRIM(TRANSLATE(replace(trim(test_str), ' ', 'x'), ' ', '0123456789')))=0
then 'integer' else 'not integer' end is_integer
from (VALUES
(' 123 ' )
,(' abc ' )
,(' a12 ' )
,(' 12 3 ')
,(' 99.3 ')
,('993' )
) AS X(test_str)
;
このサンプルセットの結果は次のとおりです。
TEST_STR 2 TO_INTEGER IS_INTEGER
-------- -------- ----------- -----------
123 123 integer
abc abc - not integer
a12 a - not integer
12 3 x - not integer
99.3 . - not integer
993 993 integer
Charフィールドがすべて先頭または末尾のスペースを含まない数値である数値を返します。すなわち;フィールド内のすべての文字は数字です:
where translate(char_field, 'X ',' 0123456789') = ' '
先行スペースが非数値と見なされる非数値を返しますが、後続スペースは無視されます。すなわち;先頭にスペースがある場合は非数値ですが、末尾にスペースがある場合は数値ではありません。これは、メインフレーム/ Cobol-loadedフィールドの一般的な発生です。
where not ( length(rtrim(translate(substr(char_field,1,length(rtrim(char_field))),' ','0123456789'))) = 0)
数値を末尾に付けて返しますが、値の後の先頭のスペースは返しません。すなわち;先行スペースは非数値として扱われますが、後続スペースは無視されます。繰り返しますが、メインフレーム/ Cobol CHARフィールドに共通:
where ( length(rtrim(translate(substr(char_field,1,length(rtrim(char_field))),'X ',' 0123456789'))) = 0)
先頭および末尾のスペースを含む数値を返します。すなわち;フィールドが「数値」であると判断する際に、先頭と末尾のスペースを無視します。
where ( length(ltrim(rtrim(translate(substr(char_field,1,length(ltrim(rtrim(char_field)))),' ','0123456789')))) = 0)
XQbertによる答えは完全に正しいわけではありません。実際に必要なのは、fromString内のすべての文字に対して*で(スペースを削除する必要があります)、to文字列の長さは元の文字列の長さと同じである必要があります。
次のようになります。
CASE
WHEN LENGTH(RTRIM(TRANSLATE(test_str, '**********', '0123456789'))) = LENGTH(RTRIM(test_str))
THEN 'All digits'
ELSE 'No'
END