2010-01-09 5 views
21

C'est je pense que c'est un problème simple, mais pas encore la solution. Je voudrais obtenir les nombres valides seulement d'une colonne comme expliqué ici.sql comme opérateur pour obtenir les chiffres seulement

Disons que nous avons une colonne varchar avec les valeurs suivantes

ABC 
Italy 
Apple 
234.62 
2:234:43:22 
France 
6435.23 
2 
Lions 

Ici, le problème est de sélectionner uniquement des chiffres

select * from tbl where answer like '%[0-9]%' aurait fait, mais il retourne

234.62 
    2:234:43:22 
    6435.23 
    2 

Ici, évidemment, 2: 234: 43: 22 n'est pas désiré car ce n'est pas un nombre valide.

Le résultat souhaité est

 234.62 
     6435.23 
     2 

Est-il possible de le faire?

Répondre

20

Vous pouvez essayer cette

ISNUMERIC (Transact-SQL)

retours ISNUMERIC 1 lorsque l'expression entrée évalue à un type de données numérique valide; sinon il renvoie 0.

DECLARE @Table TABLE(
     Col VARCHAR(50) 
) 

INSERT INTO @Table SELECT 'ABC' 
INSERT INTO @Table SELECT 'Italy' 
INSERT INTO @Table SELECT 'Apple' 
INSERT INTO @Table SELECT '234.62' 
INSERT INTO @Table SELECT '2:234:43:22' 
INSERT INTO @Table SELECT 'France' 
INSERT INTO @Table SELECT '6435.23' 
INSERT INTO @Table SELECT '2' 
INSERT INTO @Table SELECT 'Lions' 

SELECT * 
FROM @Table 
WHERE ISNUMERIC(Col) = 1 
+1

+1 Ceci est une bien meilleure solution que la mienne. Je vais quitter le mien, car il semble fonctionner sur ce cas limité, mais va juste montrer que j'ai besoin d'apprendre toutes les fonctions intégrées. –

+0

Sure David Même ici (besoin d'apprendre des fonctions intégrées) :)! Votre réponse avec like est également bonne. – Thunder

+0

Malheureusement, ISNUMERIC acceptera les singletons de + -. – gbn

8

Essayez quelque chose comme ça - ça marche pour les cas que vous avez mentionnés.

select * from tbl 
where answer like '%[0-9]%' 
and answer not like '%[:]%' 
and answer not like '%[A-Z]%' 
32

Vous pouvez utiliser ce qui suit pour inclure uniquement les caractères valides:

SQL

SELECT * FROM @Table 
WHERE Col NOT LIKE '%[^0-9.]%' 

Résultats

Col 
--------- 
234.62 
6435.23 
2 
+3

[Nécessite une clause d'assemblage ou utilise un ensemble au lieu d'une plage] (http://dba.stackexchange.com/questions/34730/why-are-non-digits-like-0-9/34731#34731) –

+4

I sachez que c'est un post très daté, mais je viens juste de le découvrir. Je pense toujours qu'il est nécessaire de signaler que cela retournera une adresse IP (ou toute autre valeur avec plusieurs points décimaux). –

+0

Ceci est une excellente réponse! Pour répondre aux commentaires ci-dessus, il suffit d'inclure isnumeric: 'WHERE Col Like LIKE '% [^ 0-9.]%' ET ISNUMERIC (Col) = 1' –

1

Avec SQL 2012 et plus tard, vous pouvez utiliser TRY_CAST/TRY_CONVERT pour essayer la conversion en un type numérique, par ex. TRY_CAST(answer AS float) IS NOT NULL - notez cependant que cela correspondra aussi à la notation scientifique (1 + E34). (Si vous utilisez decimal, la notation scientifique ne correspondra pas)

Questions connexes