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)
CASE
WHEN LENGTH(RTRIM(TRANSLATE(test_str, '*', ' 0123456789'))) = 0
THEN 'All digits'
ELSE 'No'
END
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 :)
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+$')
Utilisez la fonction ASCII pour obtenir une valeur de caractère et comparez-la entre 48 '0' et 57 '9'
Fonction ASCII Renvoie la valeur de code ASCII du caractère le plus à gauche de l'argument sous forme d'entier.
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
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)
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