DB2 - como verificar se o valor do campo varchar tem inteiros

Existe uma função DB2 incorporada ou qualquer consulta para verificar se o carácter que tenho é um número? (I cannot use user defined functions)

 12
Author: Andy, 2012-05-08

7 answers

Ligação Do Doc

CASE
  WHEN LENGTH(RTRIM(TRANSLATE(test_str, '*', ' 0123456789'))) = 0 
  THEN 'All digits'
  ELSE 'No'
END
 21
Author: xQbert, 2016-11-16 13:03:41
Há muitas abordagens. Dê uma olhada nessa solução usando apenas duas funções:
CASE
    WHEN REPLACE(TRANSLATE(test_str, '0','123456789','0'),'0','') = ''
    THEN 'All digits'
    ELSE 'Not all digits'
END

Em geral-menos funções - Melhor desempenho:)

 2
Author: Mita, 2016-02-21 21:14:29

Usar a função ASCII para obter o valor do carácter e comparar que está entre 48 ' 0 'e 57' 9 '

Quadro ASCII

Função ASCII Devolve o valor de código ASCII do carácter mais à esquerda do argumento como um inteiro.

 1
Author: Atilla Ozgur, 2012-05-07 22:00:43

Se a versão do db2 pode usar o regexp_ como se o pudesse fazer:

Número com"."como símbolo decimal:

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

Número Com", " como símbolo decimal:

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

Número sem símbolo decimal (apenas inteiro, a sua pergunta)

 select *      from yourtable                  
 where REGEXP_LIKE(trim(yourzone) , '^\d+$')
 1
Author: Esperento57, 2016-10-21 04:12:31
A resposta de xQbert não está completamente correcta. O que você realmente precisa é de um * para cada personagem no fromString (e o espaço precisa ser removido) e o comprimento do to string precisa ser o mesmo que o comprimento do string original.

Então vai parecer assim:

CASE
  WHEN LENGTH(RTRIM(TRANSLATE(test_str, '**********', '0123456789'))) = LENGTH(RTRIM(test_str)) 
  THEN 'All digits'
  ELSE 'No'
END
 0
Author: Ruben van Straten, 2015-12-03 07:19:57

Devolve numérico onde o campo char é todos os numéricos sem espaços iniciais ou finais. ie; todos os caracteres no campo são numéricos:

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

Devolve valores não-numéricos com os espaços iniciais considerados não-numéricos, mas os espaços finais ignorados. ie; não numérico se existirem espaços iniciais, mas não se existirem espaços finais. Esta é uma ocorrência comum para os campos carregados em mainframe/Cobol:

where not ( length(rtrim(translate(substr(char_field,1,length(rtrim(char_field))),'         ','0123456789'))) = 0)

Devolve numérico com os espaços finais, mas não com os espaços iniciais após o valor. ie; Os espaços iniciais são tratados como não-numéricos, mas os espaços finais são ignorados. Mais uma vez, comum para os campos Char mainframe / Cobol:

where ( length(rtrim(translate(substr(char_field,1,length(rtrim(char_field))),'X         ',' 0123456789'))) = 0)

Devolve numérico com os espaços iniciais e finais. ie; ignora os espaços iniciais e finais na determinação do campo é "numérico":

where ( length(ltrim(rtrim(translate(substr(char_field,1,length(ltrim(rtrim(char_field)))),'         ','0123456789')))) = 0)
 0
Author: user3473636, 2016-01-15 13:37:35

Fiz uma versão mais propensa a erros com base na ideia exposta por xQbert, adicionei um resultado intermedia, alguns exemplos e uma coluna de to_ inteiro que converte o valor de cadeia de forma segura em Inteiro:

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)
;

O resultado deste conjunto de exemplos é:

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
Author: Robert Lujo, 2016-03-24 22:47:34