web-dev-qa-db-ja.com

DB2- varcharフィールド値に整数があるかどうかを確認する方法

私が持っている文字が数字であるかどうかを確認する組み込みのDB2関数またはクエリはありますか? (ユーザー定義関数を使用できません)

15
Andy

ドキュメントリンク

CASE
  WHEN LENGTH(RTRIM(TRANSLATE(test_str, '*', ' 0123456789'))) = 0 
  THEN 'All digits'
  ELSE 'No'
END
25
xQbert

多くのアプローチがあります。次の2つの関数のみを使用して、そのソリューションを見てください。

CASE
    WHEN REPLACE(TRANSLATE(test_str, '0','123456789','0'),'0','') = ''
    THEN 'All digits'
    ELSE 'Not all digits'
END

一般的に-機能が少ない-パフォーマンスが向上します:)

2
Mita

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+$')
1
Esperento57

ASCII関数を使用して文字値を取得し、それが48 '0'と57 '9'の間であることを比較します

ASCIIテーブル

ASCII関数引数の左端の文字のASCIIコード値を整数として返します。

1
Atilla Ozgur

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
0
Robert Lujo

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)
0
user3473636

XQbertによる答えは完全に正しいわけではありません。実際に必要なのは、fromString内のすべての文字に対して*で(スペースを削除する必要があります)、to文字列の長さは元の文字列の長さと同じである必要があります。

次のようになります。

CASE
  WHEN LENGTH(RTRIM(TRANSLATE(test_str, '**********', '0123456789'))) = LENGTH(RTRIM(test_str)) 
  THEN 'All digits'
  ELSE 'No'
END
0