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)
7 answers
CASE
WHEN LENGTH(RTRIM(TRANSLATE(test_str, '*', ' 0123456789'))) = 0
THEN 'All digits'
ELSE 'No'
END
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:)
Usar a função ASCII para obter o valor do carácter e comparar que está entre 48 ' 0 'e 57' 9 '
Função ASCII Devolve o valor de código ASCII do carácter mais à esquerda do argumento como um inteiro.
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+$')
Então vai parecer assim:
CASE
WHEN LENGTH(RTRIM(TRANSLATE(test_str, '**********', '0123456789'))) = LENGTH(RTRIM(test_str))
THEN 'All digits'
ELSE 'No'
END
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)
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