2008-09-16 65 views

Respuesta

172

Asumiré que desea comprobar un valor de cadena. Una buena forma es el operador REGEXP, que combina la cadena con una expresión regular. Simplemente haga

select field from table where field REGEXP '^-?[0-9]+$'; 

esto es bastante rápido. Si su campo es numérico, simplemente realice una prueba para

ceil(field) = field 

en su lugar.

+3

El 'ceil (campo) = campo' la prueba es una buena idea, pero como @Jumpy señaló, falla en datos no numéricos: SELECT ceil ('four') = 'four'; -> 1 –

+1

@MatthewCornell, Dijo si su campo es numérico. Eso es para que puedas probar si un número es un número entero. No funcionará en cadenas, por eso la primera opción está ahí. – Malfist

+0

Si los datos pueden incluir espacios en blanco, esto fallaría. Considere la prueba de recorte (campo), posiblemente con una arg extra para eliminar las nuevas líneas. –

10

Combínalo con una expresión regular.

c.f. http://forums.mysql.com/read.php?60,1907,38488#msg-38488 como se cita a continuación:

Re: IsNumeric() cláusula en MySQL ??
Publicado por: kevinclark()
Fecha: 08 de agosto de, de 2005 13:01


estoy de acuerdo. Aquí es una función que he creado para MySQL 5:

CREATE FUNCTION IsNumeric (sIn varchar(1024)) RETURNS tinyint 
RETURN sIn REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$'; 


Esto permite un signo opcional de más/menos al comienzo, un punto decimal opcional y los dígitos numéricos de descanso.

+0

Gracias, su solución se encarga de decimales también – Ananda

7

Aquí está la solución simple para que suponiendo que el tipo de datos es VARCHAR

select * from calender where year > 0 

Se devolverá verdadero si el año es numérico y false

+27

En varchar, esto también volverá verdadero si el primer carácter es numérico. – TuK

+0

No lo noté. votando tu comentario :) – Jayjitraj

1

He intentado usar las expresiones regulares mencionados anteriormente, pero no funcionan para lo siguiente:

SELECT '12 INCHES' REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$' FROM ... 

el anterior devolverá 1 (TRUE), que significa la prueba de la cadena '12 PULGADAS 'contra la expresión regular anterior, devuelve TRUE. Parece un número basado en la expresión regular utilizada anteriormente. En este caso, como el 12 está al principio de la cadena, la expresión regular lo interpreta como un número.

El siguiente devolverá el valor correcto (es decir 0) debido a que la cadena comienza con caracteres en lugar de dígitos

SELECT 'TOP 10' REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$' FROM ... 

Lo anterior regresará 0 (FALSE) debido a que el principio de la cadena es el texto y no es numérico .

Sin embargo, si se trata de cadenas que tienen una combinación de números y letras que comienzan con un número, no obtendrá los resultados que desea. REGEXP interpretará la cadena como un número válido cuando en realidad no lo es.

+1

Esto es incorrecto. ¿Lo has probado? Cuando ejecuto su primer ejemplo, devuelve 'FALSE', como se esperaba, porque la expresión regular termina con' $ ', lo que significa el final de la cadena, por lo que solo comprueba los números, según lo previsto por el autor. – spikyjt

2

¿Qué hay de:

WHERE table.field = "0" or CAST(table.field as SIGNED) != 0 

a prueba para numérico y el corolario:

WHERE table.field != "0" and CAST(table.field as SIGNED) = 0 
+1

CAST (table.field)! = 0 no funcionará ya que necesita un tipo para transmitir. – Riad

+0

Esto funciona perfecto si necesita probar elementos no numéricos, esto merece más +1. Las otras respuestas son más difíciles de invertir la prueba para encontrar los elementos no numéricos. – DrCord

+0

Esto no funciona para números como "0000", "0" (espacio) y "7x" (que se considera un número). –

9

Supongamos que tenemos columna con entradas de campo que tiene alfanuméricos como

a41q 
1458 
xwe8 
1475 
asde 
9582 
. 
. 
. 
. 
. 
qe84 

y quiere más alto valor numérico de esta columna db (en este caso es 9582), entonces esta consulta lo ayudará

SELECT Max(column_name) from table_name where column_name REGEXP '^[0-9]+$' 
+0

* '10000' * es mayor, pero su consulta aún devolverá * '9582' *. –

5

Esto también funciona:

CAST(coulmn_value AS UNSIGNED) // will return 0 if not numeric string. 

por ejemplo

SELECT CAST('a123' AS UNSIGNED) // returns 0 
SELECT CAST('123' AS UNSIGNED) // returns 123 i.e. > 0 
+9

¿qué pasa con 'SELECT CAST ('12a34' AS UNSIGNED)', que devuelve '12'? –

+1

Esto funciona perfecto si necesita probar elementos no numéricos, esto merece más +1. Las otras respuestas son más difíciles de invertir la prueba para encontrar los elementos no numéricos. – DrCord

+1

@DrCord esto no funciona para el caso que describió Mike C, por lo tanto es muy poco confiable – jontro

2

Para comprobar si un valor es de tipo int en MySQL, podemos utilizar la siguiente consulta. Esta consulta dará a las filas con valores int

SELECT col1 FROM table WHERE concat('',col * 1) = col; 
+0

Esta respuesta funcionó para mí. – Pupil

+0

Esto también seleccionará números no enteros (por ejemplo, * '3.5' *). –

0

Esto funciona bien para VARCHAR donde comienza con un número o no ..

WHERE concat('',fieldname * 1) != fieldname 

pueden tener restricciones cuando se llega a la mayor NNNNE + - números

0

para mí lo único que funciona es:

CREATE FUNCTION IsNumeric (SIN VARCHAR(1024)) RETURNS TINYINT 
RETURN SIN REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$'; 

de kevinclark todos los demás retorno cosas inútiles para mí en caso de 234jk456 o 12 inches

Cuestiones relacionadas