¿Tiene mysql una función como is_num() que me permite determinar si los datos son numéricos o no?¿Cómo solo seleccionar datos numéricos de mysql?
Gracias.
¿Tiene mysql una función como is_num() que me permite determinar si los datos son numéricos o no?¿Cómo solo seleccionar datos numéricos de mysql?
Gracias.
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)
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 |
+--------+
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)
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;
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;
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 ;
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. –
@Raj - Seguí adelante y eliminé esa línea. No creo que ayudeSimplemente se eliminará en el bucle "WHILE" de todos modos. – VenerableAgents