C'è un modo per rilevare se un valore è un numero in una query MySQL? Ad esempio
SELECT *
FROM myTable
WHERE isANumber(col1) = true
C'è un modo per rilevare se un valore è un numero in una query MySQL? Ad esempio
SELECT *
FROM myTable
WHERE isANumber(col1) = true
Risposte:
Questo dovrebbe funzionare nella maggior parte dei casi.
SELECT * FROM myTable WHERE concat('',col1 * 1) = col1
Non funziona per numeri non standard come
1e4
1.2e5
123.
(decimale finale)Puoi anche usare Regular Expression ... sarebbe come:
SELECT * FROM myTable WHERE col1 REGEXP '^[0-9]+$';
Riferimento: http://dev.mysql.com/doc/refman/5.1/en/regexp.html
WHERE col1 NOT REGEXP...
e per il caso in cui potresti avere un punto decimale, usa regex:^[0-9\.]+$
Se i tuoi dati sono 'test', 'test0', 'test1111', '111test', '111'
Per selezionare tutti i record in cui i dati sono un semplice int:
SELECT *
FROM myTable
WHERE col1 REGEXP '^[0-9]+$';
Risultato: '111'
(In regex, ^ significa inizio e $ significa fine)
Per selezionare tutti i record in cui esiste un numero intero o un numero decimale:
SELECT *
FROM myTable
WHERE col1 REGEXP '^[0-9]+\\.?[0-9]*$'; - for 123.12
Risultato: '111' (uguale all'ultimo esempio)
Infine, per selezionare tutti i record in cui esiste un numero, utilizzare questo:
SELECT *
FROM myTable
WHERE col1 REGEXP '[0-9]+';
Risultato: 'test0' e 'test1111' e '111test' e '111'
REGEXP '^[+\-]?[0-9]+\\.?[0-9]*$'
SELECT * FROM myTable
WHERE col1 REGEXP '^[+-]?[0-9]*([0-9]\\.|[0-9]|\\.[0-9])[0-9]*(e[+-]?[0-9]+)?$'
Abbinerà anche i decimali firmati (come -1.2, +0.2, 6., 2e9, 1.2e-10 ).
Test:
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;
Risultato:
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
Restituisce righe numeriche
Ho trovato la soluzione con la seguente query e funziona per me:
SELECT * FROM myTable WHERE col1 > 0;
Questa query restituisce righe con una colonna con un numero maggiore di zero col1
Restituisce righe non numeriche
se vuoi controllare la colonna non numerica prova questa con il trucco ( !col1 > 0
):
SELECT * FROM myTable WHERE !col1 > 0;
SELECT * FROM myTable WHERE col1 = 123;
query restituirà righe anche il valore col è123abc
utilizzare un UDF (funzione definita dall'utente).
CREATE FUNCTION isnumber(inputValue VARCHAR(50))
RETURNS INT
BEGIN
IF (inputValue REGEXP ('^[0-9]+$'))
THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END;
Quindi quando esegui una query
select isnumber('383XXXX')
- restituisce 0
select isnumber('38333434')
- resi 1
selezionare isnumber (mycol) mycol1, col2, colx da tablex; - restituirà 1s e 0s per la colonna mycol1
--puoi migliorare la funzione per prendere decimali, notazione scientifica, ecc ...
Il vantaggio di usare un UDF è che puoi usarlo sul lato sinistro o destro del confronto "clausola where". questo semplifica notevolmente il tuo SQL prima di essere inviato al database:
SELECT * from tablex where isnumber(columnX) = isnumber('UnkownUserInput');
spero che questo ti aiuti.
Un'altra alternativa che sembra più veloce di REGEXP sul mio computer è
SELECT * FROM myTable WHERE col1*0 != col1;
Questo selezionerà tutte le righe in cui col1 inizia con un valore numerico.
AND col1<>0
per gestire quell'eccezione.
'1a'
. A proposito: è equivalente a WHERE col1 <> 0
- rextester.com/DJIS1493
Manca ancora questa versione semplice:
SELECT * FROM myTable WHERE `col1` + 0 = `col1`
(l'aggiunta dovrebbe essere più veloce come moltiplicazione)
O versione più lenta per ulteriori riproduzioni:
SELECT *,
CASE WHEN `col1` + 0 = `col1` THEN 1 ELSE 0 END AS `IS_NUMERIC`
FROM `myTable`
HAVING `IS_NUMERIC` = 1
'a' + 0 = 'a'
è VERO
Consiglio: se la tua ricerca è semplice, puoi usare `
column*1 = column
`operatore interessante :) è lavoro e più veloce rispetto ai campi varchar / char
SELEZIONA * DA myTable DOVE colonna * 1 = colonna;
ABC*1 => 0 (NOT EQU **ABC**)
AB15*A => 15 (NOT EQU **AB15**)
15AB => 15 (NOT EQU **15AB**)
15 => 15 (EQUALS TRUE **15**)
select 'aaa123' >= 0
che il select '123aaa' >= 0
vero ritorno?
SELECT * FROM myTable WHERE sign (col1)!=0
ofcourse sign (0) è zero, ma puoi limitare la query a ...
SELECT * FROM myTable WHERE sign (col1)!=0 or col1=0
AGGIORNAMENTO: Questo non è affidabile al 100%, perché "1abc" restituirà il segno 1, ma "ab1c" restituirà zero ... quindi potrebbe funzionare solo per il testo che non inizia con i numeri.
Prova a dividere / 1
select if(value/1>0 or value=0,'its a number', 'its not a number') from table