it-swarm-es.tech

¿Cómo verifico si un valor es un entero en MySQL?

Veo que dentro de MySQL hay funciones Cast() y Convert() para crear enteros a partir de valores, pero ¿hay alguna forma de verificar si un valor es un entero? Algo así como is_int() en PHP es lo que estoy buscando.

105
Craig Nakamoto

Asumiré que desea comprobar un valor de cadena. Una forma agradable es el operador REGEXP, que hace coincidir la cadena con una expresión regular. Simplemente hacer

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

esto es razonablemente rápido. Si su campo es numérico, solo pruebe para

ceil(field) = field

en lugar.

189
Jumpy

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 2005 01:01 PM


Estoy de acuerdo. Aquí hay una función que creé 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 más/menos opcional al principio, un punto decimal opcional y los dígitos numéricos restantes.

13
JBB

Supongamos que tenemos una columna con un campo alfanumérico que tiene entradas como

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

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

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

Aquí está la solución simple para ello asumiendo que el tipo de datos es varchar

select * from calender where year > 0

Devolverá verdadero si el año es numérico o falso

8
Jayjitraj

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
6
Riad

Para verificar si un valor es Int en Mysql, podemos usar la siguiente consulta. Esta consulta le dará las filas con valores int.

SELECT col1 FROM table WHERE concat('',col * 1) = col;
4
minhas23

Qué pasa:

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

para probar el numérico y el corolario:

WHERE table.field != "0" and CAST(table.field as SIGNED) = 0
3
Tom Auger

Lo mejor que puedo pensar de una variable es un int. Es una combinación con las funciones de MySQL CAST() y LENGTH().
Este método funcionará en cadenas de caracteres, enteros, tipos de datos de dobles/flotantes.

SELECT (LENGTH(CAST(<data> AS UNSIGNED))) = (LENGTH(<data>)) AS is_int

ver demostración http://sqlfiddle.com/#!9/ff40cd/44

fallará si la columna tiene un solo valor de carácter. si la columna tiene un valor 'A', entonces Cast ('A' como UNSIGNED) evaluará a 0 y LENGTH (0) será 1. así que LENGTH (Cast ('A' como UNSIGNED)) = LENGTH (0) evaluará a 1 = 1 => 1

El verdadero Waqas Malik está totalmente borracho para probar ese caso. el parche es.

SELECT <data>, (LENGTH(CAST(<data> AS UNSIGNED))) = CASE WHEN CAST(<data> AS UNSIGNED) = 0 THEN CAST(<data> AS UNSIGNED) ELSE (LENGTH(<data>)) END AS is_int;

Resultados

**Query #1**

    SELECT 1, (LENGTH(CAST(1 AS UNSIGNED))) = CASE WHEN CAST(1 AS UNSIGNED) = 0 THEN CAST(1 AS UNSIGNED) ELSE (LENGTH(1)) END AS is_int;

| 1   | is_int |
| --- | ------ |
| 1   | 1      |

---
**Query #2**

    SELECT 1.1, (LENGTH(CAST(1 AS UNSIGNED))) = CASE WHEN CAST(1.1 AS UNSIGNED) = 0 THEN CAST(1.1 AS UNSIGNED) ELSE (LENGTH(1.1)) END AS is_int;

| 1.1 | is_int |
| --- | ------ |
| 1.1 | 0      |

---
**Query #3**

    SELECT "1", (LENGTH(CAST("1" AS UNSIGNED))) = CASE WHEN CAST("1" AS UNSIGNED) = 0 THEN CAST("1" AS UNSIGNED) ELSE (LENGTH("1")) END AS is_int;

| 1   | is_int |
| --- | ------ |
| 1   | 1      |

---
**Query #4**

    SELECT "1.1", (LENGTH(CAST("1.1" AS UNSIGNED))) = CASE WHEN CAST("1.1" AS UNSIGNED) = 0 THEN CAST("1.1" AS UNSIGNED) ELSE (LENGTH("1.1")) END AS is_int;

| 1.1 | is_int |
| --- | ------ |
| 1.1 | 0      |

---
**Query #5**

    SELECT "1a", (LENGTH(CAST("1.1" AS UNSIGNED))) = CASE WHEN CAST("1a" AS UNSIGNED) = 0 THEN CAST("1a" AS UNSIGNED) ELSE (LENGTH("1a")) END AS is_int;

| 1a  | is_int |
| --- | ------ |
| 1a  | 0      |

---
**Query #6**

    SELECT "1.1a", (LENGTH(CAST("1.1a" AS UNSIGNED))) = CASE WHEN CAST("1.1a" AS UNSIGNED) = 0 THEN CAST("1.1a" AS UNSIGNED) ELSE (LENGTH("1.1a")) END AS is_int;

| 1.1a | is_int |
| ---- | ------ |
| 1.1a | 0      |

---
**Query #7**

    SELECT "a1", (LENGTH(CAST("1.1a" AS UNSIGNED))) = CASE WHEN CAST("a1" AS UNSIGNED) = 0 THEN CAST("a1" AS UNSIGNED) ELSE (LENGTH("a1")) END AS is_int;

| a1  | is_int |
| --- | ------ |
| a1  | 0      |

---
**Query #8**

    SELECT "a1.1", (LENGTH(CAST("a1.1" AS UNSIGNED))) = CASE WHEN CAST("a1.1" AS UNSIGNED) = 0 THEN CAST("a1.1" AS UNSIGNED) ELSE (LENGTH("a1.1")) END AS is_int;

| a1.1 | is_int |
| ---- | ------ |
| a1.1 | 0      |

---
**Query #9**

    SELECT "a", (LENGTH(CAST("a" AS UNSIGNED))) = CASE WHEN CAST("a" AS UNSIGNED) = 0 THEN CAST("a" AS UNSIGNED) ELSE (LENGTH("a")) END AS is_int;

| a   | is_int |
| --- | ------ |
| a   | 0      |

ver demo

2
Raymond Nijland

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

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

Lo anterior devolverá 1 (TRUE), es decir, 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.

Lo siguiente devolverá el valor correcto (es decir, 0) porque 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 devolverá 0 (FALSE) porque el principio de la cadena es texto y no numérico.

Sin embargo, si está tratando con 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.

2
Bill Kelly

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

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

puede tener restricciones cuando llegas a los NNNNE + más grandes - números

0
PodTech.io

para mi 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, todas las demás devuelven cosas inútiles para mí en caso de 234jk456 o 12 inches

0
Tim