web-dev-qa-db-fra.com

DB2 - Comment vérifier si la valeur du champ varchar a des entiers

Existe-t-il une fonction DB2 intégrée ou une requête permettant de vérifier si le caractère que j'ai est un nombre? (Je ne peux pas utiliser les fonctions définies par l'utilisateur)

13
Andy

Doc Link

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

Il y a beaucoup d'approches. Jetez un oeil à cette solution en utilisant seulement deux fonctions:

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

En général - moins de fonctions - de meilleures performances :)

2
Mita

si votre version de db2 pouvez utiliser regexp_like, vous pouvez le faire:

nombre avec "." comme symbole décimal:

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

nombre avec "," comme symbole décimal:

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

nombre sans symbole décimal (entier uniquement, votre demande)

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

Utilisez la fonction ASCII pour obtenir une valeur de caractère et comparez-la entre 48 '0' et 57 '9'

ASCII Tableau

Fonction ASCII Renvoie la valeur de code ASCII du caractère le plus à gauche de l'argument sous forme d'entier.

1
Atilla Ozgur

J'ai créé une version plus sujette aux erreurs basée sur l'idée exposée par xQbert, un résultat intermedia ajouté, des exemples et la colonne to_integer qui convertit la valeur de chaîne en toute sécurité en entier:

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

Le résultat pour cet exemple est:

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

Retourne numeric où le champ char est tout numérique sans espaces de début ni de fin. c'est à dire; Tous les caractères du champ sont numériques:

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

Renvoie les valeurs non numériques avec les espaces de début considérés comme non numériques, mais les espaces de fin sont ignorés. c'est à dire; non numérique s'il y a des espaces de début, mais pas s'il y a des espaces de fin. Il s'agit d'une occurrence commune pour les champs chargés de mainframe/Cobol:

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

Retourne un nombre avec la fin, mais pas les espaces après la valeur. c'est à dire; Les espaces de début sont traités comme non numériques, mais les espaces de fin sont ignorés. Encore une fois, commun pour les champs CHAR mainframe/Cobol:

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

Renvoie numérique avec les espaces de début et de fin. c'est à dire; ignore les espaces de début et de fin dans le champ de détermination est "numérique":

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

La réponse de xQbert n’est pas tout à fait correcte ..__ Ce dont vous avez réellement besoin est un * pour chaque caractère de la chaîne fromString (et l’espace doit être supprimé) et la longueur de la chaîne to doit être identique à celle la chaîne d'origine.

donc ça va ressembler à ça:

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