Existe uma maneira de detectar se um valor é um número em uma consulta MySQL? Tal como
SELECT *
FROM myTable
WHERE isANumber(col1) = true
mysql
sql
where-clause
Urbycoz
fonte
fonte
Respostas:
Isso deve funcionar na maioria dos casos.
Não funciona para números fora do padrão, como
1e4
1.2e5
123.
(decimal à direita)fonte
Você também pode usar Expressão Regular ... seria como:
Referência: http://dev.mysql.com/doc/refman/5.1/en/regexp.html
fonte
WHERE col1 NOT REGEXP...
e para o caso em que você pode ter um ponto decimal, use regex:^[0-9\.]+$
Se seus dados forem 'test', 'test0', 'test1111', '111test', '111'
Para selecionar todos os registros em que os dados são simples:
Resultado: '111'
(No regex, ^ significa começo e $ significa fim)
Para selecionar todos os registros onde existe um número inteiro ou decimal:
Resultado: '111' (igual ao último exemplo)
Por fim, para selecionar todos os registros onde o número existe, use o seguinte:
Resultado: 'test0' e 'test1111' e '111test' e '111'
fonte
REGEXP '^[+\-]?[0-9]+\\.?[0-9]*$'
Também corresponderá às casas decimais assinadas (como -1,2, +0,2, 6., 2e9, 1,2e-10 ).
Teste:
Resultado:
Demo
fonte
Retorna linhas numéricas
Encontrei a solução com a seguinte consulta e funciona para mim:
Esta consulta retorna linhas com apenas uma coluna numérica maior que zero
col1
Retorna linhas não numéricas
se você quiser verificar a coluna não numérica, tente esta com o truque (
!col1 > 0
):fonte
SELECT * FROM myTable WHERE col1 = 123;
consulta retornará linhas, o valor da coluna é123abc
Essa resposta é semelhante a Dmitry, mas permitirá números decimais, além de números positivos e negativos.
fonte
use um UDF (função definida pelo usuário).
Então, quando você consulta
- retornos 0
--returns 1
selecione isnumber (mycol) mycol1, col2, colx de tablex; - retornará 1s e 0s para a coluna mycol1
- você pode aprimorar a função para obter decimais, notação científica, etc ...
A vantagem de usar um UDF é que você pode usá-lo no lado esquerdo ou direito da sua comparação "cláusula where". isso simplifica bastante o seu SQL antes de ser enviado ao banco de dados:
espero que isto ajude.
fonte
Outra alternativa que parece mais rápida que o REGEXP no meu computador é
Isso selecionará todas as linhas em que col1 começa com um valor numérico.
fonte
AND col1<>0
para lidar com essa exceção.'1a'
. BTW: é equivalente aWHERE col1 <> 0
- rextester.com/DJIS1493Ainda falta esta versão simples:
(a adição deve ser mais rápida como multiplicação)
Ou versão mais lenta para continuar jogando:
fonte
'a' + 0 = 'a'
é VERDADEIROEu recomendo: se sua pesquisa for simples, você pode usar o `
`operador interessante :) é trabalho e mais rápido do que nos campos varchar / char
fonte
select 'aaa123' >= 0
eselect '123aaa' >= 0
return true?O sinal de curso (0) é zero, mas você pode restringir sua consulta a ...
fonte
fonte
Eu descobri que isso funciona muito bem
fonte
col1 <> 0
e fornecer um falso positivo para1a
- rextester.com/HLORBZ1242Tente dividir / 1
fonte