DB2-如何检查varchar字段值是否有整数

时间:2012-05-07 21:54:08

标签: sql db2

是否有内置的DB2函数或任何查询来检查我的字符是否是数字? (我不能使用用户定义的函数)

7 个答案:

答案 0 :(得分:25)

Doc Link

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

答案 1 :(得分:2)

有很多方法。仅使用两个函数来查看该解决方案:

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

一般而言 - 功能较少 - 性能更佳:)

答案 2 :(得分:1)

使用ASCII函数获取字符值并将其比较为48'0'和57'9'

ASCII Table

ASCII功能 以整数形式返回参数最左侧字符的ASCII代码值。

答案 3 :(得分:1)

如果你的db2版本可以使用regexp_like,你可以这样做:

号码与"。"作为十进制符号:

 select *      from yourtable                            
 where REGEXP_LIKE(trim(yourzone) , '^\d+(\.\d*)?$')
用","编号

作为十进制符号:

 select *      from yourtable                            
 where REGEXP_LIKE(trim(yourzone) , '^\d+(\,\d*)?$') 

没有小数符号的数字(仅限整数,请问)

 select *      from yourtable                  
 where REGEXP_LIKE(trim(yourzone) , '^\d+$')

答案 4 :(得分:0)

xQbert的答案并不完全正确。 你真正需要的是fromString中每个字符的*(并且需要删除空格),to字符串的长度需要与原始字符串的长度相同。

所以看起来像这样:

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

答案 5 :(得分:0)

返回numeric,其中char字段是所有数字,没有前导或尾随空格。即;字段中的所有字符都是数字:

where translate(char_field, 'X         ',' 0123456789') = ' '

返回非数字值,前导空格被视为非数字,但忽略尾随空格。即;如果有前导空格,则为非数字,但如果有尾随空格则不为数字。这对于加载大型机/ Cobol的字段很常见:

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)

答案 6 :(得分:0)

我基于xQbert暴露的想法制作了更容易出错的版本,添加了intermedia结果,一些示例和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