2010-01-09 147 views
21

Esto es un problema simple pero todavía no se está solucionando. Me gustaría obtener los números válidos solo de una columna como se explica aquí.operador de sql like para obtener los números solo

digamos que tenemos una columna varchar con los valores siguientes

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

Aquí el problema es seleccionar sólo números

select * from tbl where answer like '%[0-9]%' lo habría hecho pero vuelve

234.62 
    2:234:43:22 
    6435.23 
    2 

Aquí, obviamente, 2: 234: 43: 22 no es deseado ya que no es un número válido.

El resultado deseado es

 234.62 
     6435.23 
     2 

¿Hay una manera de hacer esto?

Respuesta

20

puede probar esta

ISNUMERIC (Transact-SQL)

vuelve IsNumeric 1 cuando la expresión de entrada se evalúa como una válida tipo de datos numéricos; De lo contrario, devuelve 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 Esta es una solución mucho mejor que la mía. Dejaré el mío, ya que parece funcionar en este caso limitado, pero solo muestra que necesito aprender todas las funciones incorporadas. –

+0

Seguro David Mismo aquí (necesita aprender funciones incorporadas) :)! Tu respuesta con like también está bien, – Thunder

+0

Desafortunadamente, ISNUMERIC aceptará singletons de + -. – gbn

8

intentar algo como esto - que funciona para los casos que has mencionado.

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

Usted puede utilizar el siguiente para incluir sólo caracteres válidos:

SQL

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

Resultados

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

[Necesita una cláusula de clasificación o usa un conjunto en lugar de un rango] (http://dba.stackexchange.com/questions/34730/why-are-non-digits-like-0-9/34731#34731) –

+4

I Sé que esta es una publicación muy antigua, pero acabo de encontrarla. Sigo teniendo la necesidad de señalar que esto devolverá una dirección IP (o cualquier otro valor con múltiples puntos decimales). –

+0

¡Esta es una gran respuesta! Para abordar los comentarios anteriores, simplemente incluya isnumeric: 'WHERE Col NOT LIKE '% [^ 0-9.]%' AND ISNUMERIC (Col) = 1' –

1

con SQL 2012 y más adelante, se puede use TRY_CAST/TRY_CONVERT para tratar de convertir a un tipo numérico, p. TRY_CAST(answer AS float) IS NOT NULL - tenga en cuenta que esto coincidirá con la notación científica también (1 + E34). (Si usa decimal, la notación científica no coincidirá)

Cuestiones relacionadas