web-dev-qa-db-fra.com

sql comme opérateur pour obtenir les numéros uniquement

Je pense que c’est un problème simple mais qui n’a pas encore été résolu. Je voudrais obtenir les numéros valides seulement d'une colonne comme expliqué ici.

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 ne sélectionner que des chiffres 

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

    234.62
    2:234:43:22
    6435.23
    2

Ici, évidemment, 2: 234: 43: 22 n'est pas souhaité car ce n'est pas un numéro valide.

Le résultat souhaité est

        234.62
        6435.23
        2

Y a-t-il un moyen de faire cela? 

22
Thunder

Tu peux essayer ça

ISNUMERIC (Transact-SQL)

ISNUMERIC renvoie 1 lorsque l'entrée expression est évaluée à une valeur valide type de données numérique; sinon c'est 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
21
Adriaan Stander

Vous pouvez utiliser les éléments suivants pour inclure uniquement des caractères valides:

SQL

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

Résultats

Col
---------
234.62
6435.23
2
36
beach

Essayez quelque chose comme ceci - cela fonctionne 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]%'
10
David Hall

Avec SQL 2012 et versions ultérieures, vous pouvez utiliser TRY_CAST/TRY_CONVERT pour essayer de convertir en type numérique, par exemple TRY_CAST(answer AS float) IS NOT NULL - notez cependant que cela correspondra également à la notation scientifique (1 + E34). (Si vous utilisez decimal, la notation scientifique ne correspondra pas)

1
Mark Sowul