2010-05-03 26 views

Respuesta

6

Es posible que desee crear una función definida por el usuario que coincide con el valor con una expresión regular:

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

Fuente: MySQL Forums :: Microsoft SQL Server :: IsNumeric() clause in MySQL?


pruebas Truthy:

mysql> SELECT ISNUMERIC('1'); 
+----------------+ 
| ISNUMERIC('1') | 
+----------------+ 
|    1 | 
+----------------+ 
1 row in set (0.01 sec) 

mysql> SELECT ISNUMERIC(25); 
+---------------+ 
| ISNUMERIC(25) | 
+---------------+ 
|    1 | 
+---------------+ 
1 row in set (0.00 sec) 

mysql> SELECT ISNUMERIC('-100'); 
+-----------------+ 
| ISNUMERIC(-100) | 
+-----------------+ 
|    1 | 
+-----------------+ 
1 row in set (0.03 sec) 

mysql> SELECT ISNUMERIC('1.5'); 
+------------------+ 
| ISNUMERIC('1.5') | 
+------------------+ 
|    1 | 
+------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT ISNUMERIC('-1.5'); 
+-------------------+ 
| ISNUMERIC('-1.5') | 
+-------------------+ 
|     1 | 
+-------------------+ 
1 row in set (0.02 sec) 

Falsy Pruebas:

mysql> SELECT ISNUMERIC('a'); 
+----------------+ 
| ISNUMERIC('a') | 
+----------------+ 
|    0 | 
+----------------+ 
1 row in set (0.02 sec) 

mysql> SELECT ISNUMERIC('a1'); 
+-----------------+ 
| ISNUMERIC('a1') | 
+-----------------+ 
|    0 | 
+-----------------+ 
1 row in set (0.00 sec) 

mysql> SELECT ISNUMERIC('10a'); 
+------------------+ 
| ISNUMERIC('10a') | 
+------------------+ 
|    0 | 
+------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT ISNUMERIC('0.a'); 
+------------------+ 
| ISNUMERIC('0.a') | 
+------------------+ 
|    0 | 
+------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT ISNUMERIC('a.0'); 
+------------------+ 
| ISNUMERIC('a.0') | 
+------------------+ 
|    0 | 
+------------------+ 
1 row in set (0.00 sec) 
5

En mi caso solo necesitaba para comprobar si los datos fue> = 0 y no char, tal vez esto es útil para usted también:

mysql> select '1' REGEXP '^[0-9]+$' as result; 
+--------+ 
| result | 
+--------+ 
|  1 | 
+--------+ 
1 row in set (0.16 sec) 

mysql> select '1a' REGEXP '^[0-9]+$' as result; 
+--------+ 
| result | 
+--------+ 
|  0 | 
+--------+ 
1

Si desea seleccionar sólo los caracteres numéricos de la cadena de , tratar de usar esto:

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

CREATE FUNCTION NumericOnly (val VARCHAR(255)) 
RETURNS VARCHAR(255) 
BEGIN 
DECLARE idx INT DEFAULT 0; 
IF ISNULL(val) THEN RETURN NULL; END IF; 

IF LENGTH(val) = 0 THEN RETURN ""; END IF; 

SET idx = LENGTH(val); 
    WHILE idx > 0 DO 
    IF IsNumeric(SUBSTRING(val,idx,1)) = 0 THEN 
    SET val = REPLACE(val,SUBSTRING(val,idx,1),""); 
    SET idx = LENGTH(val)+1; 
    END IF; 
    SET idx = idx - 1; 
    END WHILE; 
    RETURN val; 
END; 

se usa llamando a la función NumericOnly así:

select NumericOnly('1&2') as result; 

Devuelve: "12"

select NumericOnly('abc987') as result; 

devuelve: "987"

(Por cierto, me escribió un post about this here)

+0

Gracias por la solución, pero hubo un error tipográfico. Cambie lo siguiente: SET idx = REPLACE (val, ".", ""); para SET VAL = REPLACE (val, ".", ""); Entonces funciona como magia. –

+0

@Raj - Seguí adelante y eliminé esa línea. No creo que ayudeSimplemente se eliminará en el bucle "WHILE" de todos modos. – VenerableAgents

1

Sólo convertir sus datos explícitamente a un número con decimales o FIRMADO/NO FIRMADO, y use STRCMP para compararlo con el valor de datos original. Si STRCMP devuelve 0 (igualdad), entonces sabrá que tiene un número. De lo contrario, no lo es.

Aquí hay un ejemplo que supone que no hay decimales en sus datos cuando son numéricos, por lo que podemos convertirlos en DECIMAL.

Esta consulta selecciona todas las filas que contienen datos numéricos en el campo is_it_a_number.

SELECT * FROM my_table WHERE 
    STRCMP(CAST(my_table.is_it_a_number AS DECIMAL(10,0)), my_table.is_it_a_number) = 0; 
0

La sintaxis simple para IsNumeric de SQL para MySQL es

sql:

SELECT isNumeric(col_name) FROM Table where isNumeric(col_name) <> 0 

Mysql

select concat('',col_name * 1) from table where concat('',col_name * 1) <> 0; 
0

mil veces más rápido.

DROP FUNCTION IF EXISTS NumericOnly; 
DELIMITER $$ 
CREATE FUNCTION NumericOnly(val VARCHAR(25)) RETURNS VARCHAR(25) 
BEGIN 
DECLARE idx INT DEFAULT 0; 
    IF ISNULL(val) THEN RETURN NULL; END IF; 
    IF LENGTH(val) = 0 THEN RETURN ""; END IF; 

SET idx = LENGTH(val); 
    WHILE idx > 0 DO 
    IF (SUBSTRING(val,idx,1) in ('0','1','2','3','4','5','6','7','8','9')) = 0 THEN 
    SET val = CONCAT(SUBSTRING(val, 1, idx-1), SUBSTRING(val FROM idx + 1)); 
    END IF; 
    SET idx = idx - 1; 
    END WHILE; 
    RETURN val; 
END; 
$$ 
DELIMITER ; 
Cuestiones relacionadas