validar una solo regulares numeros numero faltante extraer expresiones consecutivos como campos cadena sql mysql

una - Detecta si el valor es número en MySQL



numeros consecutivos sql (13)

¿Hay alguna manera de detectar si un valor es un número en una consulta MySQL?

por ejemplo, SELECT * FROM myTable WHERE isANumber(col1)=true


puedes hacerlo usando CAST

SELECT * from tbl where col1 = concat(cast(col1 as decimal), "")


Esta respuesta es similar a Dmitry, pero permitirá los números decimales y positivos y negativos.

select * from table where col1 REGEXP ''^[[:digit:]]+$''


Esto debería funcionar en la mayoría de los casos.

SELECT * FROM myTable WHERE concat('''',col1 * 1) = col1

No funciona para números no estándar como

  • 1e4
  • 1.2e5
  • 123. (decimal posterior)

Esto resuelve todos tus problemas? ya que las cadenas no se calcularán de la misma manera que los números ...

SELECT * FROM myTable WHERE sign (col1)!=0

Por supuesto, el signo (0) es cero, pero luego puede restringir su consulta a ...

SELECT * FROM myTable WHERE sign (col1)!=0 or col1=0


He descubierto que esto funciona bastante bien

if(col1/col1= 1,''number'',col1) AS myInfo


Intente dividir / 1

select if(value/1>0 or value=0,''its a number'', ''its not a number'') from table


Lo recomiendo: si su búsqueda es simple, puede usar `

column*1 = column

`operator interesting :) es trabajo y más rápido que en los campos varchar / char

SELECCIONAR * FROM myTable WHERE column * 1 = column;

ABC*1 => 0 (NOT EQU **ABC**) AB15*A => 15 (NOT EQU **AB15**) 15AB => 15 (NOT EQU **15AB**) 15 => 15 (EQUALS TRUE **15**)


Otra alternativa que parece más rápida que REGEXP en mi computadora es

SELECT * FROM myTable WHERE col1*0 != col1;

Esto seleccionará todas las filas donde col1 comienza con un valor numérico.


Si sus datos son ''prueba'', ''test0'', ''test1111'', ''111test'', ''111''

Para seleccionar todos los registros donde los datos son un simple int:

SELECT * FROM myTable WHERE col1 REGEXP ''^[0-9]+$'';

Resultado: ''111''

(En expresiones regulares, ^ significa comenzar, y $ significa finalizar)

Para seleccionar todos los registros donde existe un número entero o decimal:

SELECT * FROM myTable WHERE col1 REGEXP ''^[0-9]+//.?[0-9]*$''; - for 123.12

Resultado: ''111'' (igual que el último ejemplo)

Finalmente, para seleccionar todos los registros donde existe el número, use esto:

SELECT * FROM myTable WHERE col1 REGEXP ''[0-9]+'';

Resultado: ''test0'' y ''test1111'' y ''111test'' y ''111''



Todavía falta esta versión simple:

SELECT * FROM myTable WHERE `col1` + 0 = `col1`

(la adición debe ser más rápida que la multiplicación)

O la versión más lenta para seguir jugando:

SELECT *, CASE WHEN `col1` + 0 = `col1` THEN 1 ELSE 0 END AS `IS_NUMERIC` FROM `myTable` HAVING `IS_NUMERIC` = 1


use una UDF (función definida por el usuario).

CREATE FUNCTION isnumber(inputValue VARCHAR(50)) RETURNS INT BEGIN IF (inputValue REGEXP (''^[0-9]+$'')) THEN RETURN 1; ELSE RETURN 0; END IF; END;

Luego cuando consultas

select isnumber(''383XXXX'')

--revoluciones 0

select isnumber(''38333434'')

--retornos 1

seleccione isnumber (mycol) mycol1, col2, colx de tablex; - Devolverá 1s y 0s para la columna mycol1

- puedes mejorar la función para tomar decimales, notación científica, etc.

La ventaja de utilizar un UDF es que puede usarlo en el lado izquierdo o derecho de su comparación "where clause". esto simplifica mucho su SQL antes de ser enviado a la base de datos:

SELECT * from tablex where isnumber(columnX) = isnumber(''UnkownUserInput'');

espero que esto ayude.


SELECT * FROM myTable WHERE col1 REGEXP ''^[+-]?[0-9]*([0-9]//.|[0-9]|//.[0-9])[0-9]*(e[+-]?[0-9]+)?$''

También coincidirá con decimales firmados (como -1.2, +0.2, 6., 2e9, 1.2e-10 ).

Prueba:

drop table if exists myTable; create table myTable (col1 varchar(50)); insert into myTable (col1) values (''00.00''),(''+1''),(''.123''),(''-.23e4''),(''12.e-5''),(''3.5e+6''),(''a''),(''e6''),(''+e0''); select col1, col1 + 0 as casted, col1 REGEXP ''^[+-]?[0-9]*([0-9]//.|[0-9]|//.[0-9])[0-9]*(e[+-]?[0-9]+)?$'' as isNumeric from myTable;

Resultado:

col1 | casted | isNumeric -------|---------|---------- 00.00 | 0 | 1 +1 | 1 | 1 .123 | 0,123 | 1 -.23e4 | -2300 | 1 12.e-5 | 0,00012 | 1 3.5e+6 | 3500000 | 1 a | 0 | 0 e6 | 0 | 0 +e0 | 0 | 0