it-swarm-pt.tech

Como faço para verificar se um valor é um inteiro no MySQL?

Eu vejo que dentro do MySQL existem funções Cast() e Convert() para criar inteiros a partir de valores, mas existe alguma maneira de verificar se um valor é um inteiro? Algo como is_int() in PHP é o que estou procurando.

106
Craig Nakamoto

Eu suponho que você queira verificar um valor de string. Uma boa maneira é o operador REGEXP, combinando a string com uma expressão regular. Simplesmente faça

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

isso é razoavelmente rápido. Se o seu campo é numérico, apenas teste para

ceil(field) = field

em vez de.

190
Jumpy

Combine-o com uma expressão regular.

c.f. http://forums.mysql.com/read.php?60,1907,38488#msg-38488 como citado abaixo:

Cláusula IsNumeric () no MySQL ??
Publicado por: kevinclark ()
Data: 08 de agosto de 2005, 01:01


Concordo. Aqui está uma função que criei para o 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]+)$';


Isso permite um sinal de mais ou menos opcional no início, um ponto decimal opcional e os demais dígitos numéricos.

13
JBB

Suponha que temos coluna com campo alfanumérico tendo entradas como

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

e você quer maior valor numérico desta coluna db (neste caso, é 9582), então esta consulta irá ajudá-lo

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

Aqui está a solução simples para isso, assumindo que o tipo de dados é varchar

select * from calender where year > 0

Ele retornará verdadeiro se o ano for numérico mais falso

8
Jayjitraj

Isso também funciona:

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

por exemplo

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

Para verificar se um valor é Int no Mysql, podemos usar a seguinte consulta. Esta consulta fornecerá as linhas com valores Int

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

Sobre o quê:

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

para testar por numérico e o corrolary:

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

O melhor que eu poderia pensar de uma variável é um int É uma combinação com as funções do MySQL CAST() e LENGTH().
Esse método funcionará em tipos de dados strings, inteiros, duplos/flutuantes.

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

veja demo http://sqlfiddle.com/#!9/ff40cd/44

ele falhará se a coluna tiver um valor de caractere único. se a coluna tiver um valor 'A', então Cast ('A' como UNSIGNED) será avaliada como 0 e LENGTH (0) será 1. então LENGTH (Cast ('A' como UNSIGNED)) = LENGTH (0) será avaliado como 1 = 1 => 1

True Waqas Malik totalmente fogotten para testar esse caso. o patch é.

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      |

veja demonstração

2
Raymond Nijland

Eu tentei usar as expressões regulares listadas acima, mas elas não funcionam para o seguinte:

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

O código acima retornará 1 (TRUE), significando que o teste da string '12 INCHES 'em relação à expressão regular acima, retorna TRUE. Parece um número baseado na expressão regular usada acima. Neste caso, porque o 12 está no início da string, a expressão regular interpreta-o como um número.

O seguinte retornará o valor correto (ou seja, 0) porque a string começa com caracteres em vez de dígitos

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

As opções acima retornarão 0 (FALSE) porque o início da string é texto e não numérico.

No entanto, se você está lidando com seqüências de caracteres que têm uma combinação de números e letras que começam com um número, você não obterá os resultados desejados. REGEXP irá interpretar a string como um número válido, quando na verdade não é.

2
Bill Kelly

Isso funciona bem para VARCHAR, onde começa com um número ou não ..

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

pode ter restrições quando você chegar aos maiores NNNNE + - números

0
PodTech.io

para mim, a única coisa que funciona é:

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 os outros retornam coisas inúteis para mim em caso de 234jk456 ou 12 inches

0
Tim