SELECT1FROM DUAL
WHERE REGEXP_LIKE('23.9','^\d+(\.\d+)?$','')
J'aime bien cette solution, mais elle ne correspond pas à des nombres à plusieurs chiffres avant la virgule. par exemple, (43, 43.6) Mis à jour le post.. Pls chk. C'est une bonne solution propre et simple. Merci! pas i18n/l10n coffre - virgules v. périodes. -1, 1.2E10, etc. Une fonction avec TO_NUMBER est probablement la seule façon de le faire.
où string1 est ce que vous êtes en train d'évaluer. Elle renvoie null si elle est numérique. Regarder ici pour plus de précisions
Sachez que ce considère une chaîne de caractères comme '123+45' ou '123.45.67.89' être un nombre valide. Merci @Adrian , vous m'avez donné une idée sur la façon de tester si une chaîne contient un certain nombre en combinant les traduire et à les décoder tegether
Je n'ai pas accès à un 10G exemple pour les tests, mais cela fonctionne dans 9i:
De CRÉER OU de REMPLACER la FONCTION is_numeric (p_val VARCHAR2)
NUMÉRO DE RETOUR
EST
v_val NOMBRE;
COMMENCER
COMMENCER
SI p_val EST NULL OU de GARNITURE (p_val) ="
ALORS
RETURN 0;
FIN SI;
SÉLECTIONNEZ TO_NUMBER (p_val)
EN v_val
FROM DUAL;
RETURN 1;
EXCEPTION
QUAND LES AUTRES
ALORS
RETURN 0;
FIN;
FIN;
SÉLECTIONNEZ is_numeric ('333.5') is_numeric
FROM DUAL;
J'ai supposé que vous voulez les valeurs null/vide traités comme des FAUX.
Comme l'a souligné Tom Kyte dans http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:7466996200346537833, si vous utilisez le haut- TO_NUMBER dans une fonction définie par l'utilisateur, vous pouvez avoir besoin d'un peu de ruse pour le faire fonctionner.
FUNCTION is_number(x IN VARCHAR2)RETURN NUMBER
ISPROCEDURE check_number (y IN NUMBER)ISBEGINNULL;END;BEGIN
PRAGMA INLINE(check_number,'No');
check_number(TO_NUMBER(x);RETURN1;
EXCEPTION
WHEN INVALID_NUMBER
THENRETURN0;END is_number;
Le problème est que le compilateur optimisant peut reconnaître que le résultat de la TO_NUMBER n'est pas utilisé n'importe où et de les optimiser.
Dit Tom (son exemple a été sur les dates plutôt que des numéros):
la désactivation de la fonction inline va faire l'appel à la
check_date doit être fait comme un appel de fonction - faisant en sorte que le
La DATE doit être poussé sur la pile d'appel. Il n'y a aucune chance pour l'
compilateur optimisant pour supprimer l'appel à to_date dans ce cas. Si l'
appel à to_date nécessaires pour l'appel à la check_date échoue pour une
raison, nous savons que la chaîne de caractères d'entrée n'était pas convertible à cette date
format.
Voici une méthode pour déterminer numérique qui peut être partie d'une requête simple, sans la création d'une fonction. Comptes pour des espaces, +- pas le premier caractère, ou un deuxième point décimal.
var v_test varchar2(20);EXEC:v_test :=' -24.9 ';select(casewhen trim(:v_test)isnullthen'N'ELSE-- only banks, or null(casewhen instr(trim(:v_test),'+',2,1)>0then'N'ELSE-- + sign not first char(casewhen instr(trim(:v_test),'-',2,1)>0then'N'ELSE-- - sign not first char(casewhen instr(trim(:v_test),' ',1,1)>0then'N'ELSE-- internal spaces(casewhen instr(trim(:v_test),'.',1,2)>0then'N'ELSE-- second decimal point(casewhen LENGTH(TRIM(TRANSLATE(:v_test,' +-.0123456789',' ')))isnotnullthen'N'ELSE-- only valid numeric charcters.'Y'END)END)END)END)END)END)as is_numeric
from dual;
permet de blancs ... il accepte "123 45 6789", ce qui pour mon but n'est pas un nombre.
Un autre niveau de garniture/traduire corrige cela. La suivante va permettre de détecter une chaîne de caractères contenant des chiffres consécutifs à la tête ou à des espaces tels que to_number(trim(string1)) ne manquera pas
C'est parce que vous avez inclus le caractère d'espace au début de la deuxième paramètre à TRADUIRE. Si vous supprimez l'espace avant le +, est la volonté de ne pas autoriser les espaces dans les chaînes.
Pour les entiers, vous pouvez utiliser le ci-dessous. La première traduire des changements des espaces d'un personnage et la deuxième des changements de numéros de places. La Garniture sera alors retourner la valeur null si seulement les chiffres existent.
TRIM(TRANSLATE(TRANSLATE(TRIM('1 2 3d 4'),' ','@'),'0123456789',' '))isnull
Vous pouvez utiliser REGEXP_LIKE:
Mis à jour le post.. Pls chk.
C'est une bonne solution propre et simple. Merci!
pas i18n/l10n coffre - virgules v. périodes.
-1, 1.2E10, etc. Une fonction avec TO_NUMBER est probablement la seule façon de le faire.
OriginalL'auteur Chandu
Ca vous essayez ceci:
où string1 est ce que vous êtes en train d'évaluer. Elle renvoie null si elle est numérique. Regarder ici pour plus de précisions
Merci @Adrian , vous m'avez donné une idée sur la façon de tester si une chaîne contient un certain nombre en combinant les traduire et à les décoder tegether
OriginalL'auteur Adrian Carneiro
Je n'ai pas accès à un 10G exemple pour les tests, mais cela fonctionne dans 9i:
J'ai supposé que vous voulez les valeurs null/vide traités comme des FAUX.
OriginalL'auteur Evan Haas
Comme l'a souligné Tom Kyte dans http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:7466996200346537833, si vous utilisez le haut-
TO_NUMBER
dans une fonction définie par l'utilisateur, vous pouvez avoir besoin d'un peu de ruse pour le faire fonctionner.Le problème est que le compilateur optimisant peut reconnaître que le résultat de la
TO_NUMBER
n'est pas utilisé n'importe où et de les optimiser.Dit Tom (son exemple a été sur les dates plutôt que des numéros):
OriginalL'auteur SQB
Voici une méthode pour déterminer numérique qui peut être partie d'une requête simple, sans la création d'une fonction. Comptes pour des espaces, +- pas le premier caractère, ou un deuxième point décimal.
OriginalL'auteur John Ryan
J'ai trouvé que la solution
permet de blancs ... il accepte "123 45 6789", ce qui pour mon but n'est pas un nombre.
Un autre niveau de garniture/traduire corrige cela. La suivante va permettre de détecter une chaîne de caractères contenant des chiffres consécutifs à la tête ou à des espaces tels que to_number(trim(string1)) ne manquera pas
OriginalL'auteur Peter DeGregorio
Pour les entiers, vous pouvez utiliser le ci-dessous. La première traduire des changements des espaces d'un personnage et la deuxième des changements de numéros de places. La Garniture sera alors retourner la valeur null si seulement les chiffres existent.
OriginalL'auteur zlsmith86