Jak sprawdzić, czy wartość jest liczbą całkowitą w MySQL?

Widzę, że w MySQL istnieją funkcje Cast() i Convert() do tworzenia liczb całkowitych z wartości, ale czy jest jakiś sposób, aby sprawdzić, czy wartość jest liczbą całkowitą? Coś takiego jak is_int() w PHP jest tym, czego szukam.

 100
Author: Chetan Gawai, 2008-09-16

11 answers

Zakładam, że chcesz sprawdzić wartość łańcucha. Jednym z miłych sposobów jest operator REGEXP, dopasowujący łańcuch do wyrażenia regularnego. Simply do

select field from table where field REGEXP '^-?[0-9]+$';
To jest dość szybkie. Jeśli twoje pole jest numeryczne, po prostu przetestuj dla
ceil(field) = field
Zamiast tego.
 181
Author: Jumpy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 19:13:47

Dopasuj je do wyrażenia regularnego.

C. f. http://forums.mysql.com/read.php?60 w 1907 roku, 38488 # msg-38488 {[5] } Jak cytuję poniżej:

[1] Re: klauzula IsNumeric() w MySQL?? Dodane przez: kevinclark ()
Data: 08-08-2005 01: 01 PM


zgadzam się. Oto funkcja, którą stworzyłem dla 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]+)$';


pozwala to na opcjonalny znak plus / minus na początku, jeden opcjonalny punkt dziesiętny, a reszta cyfra cyfry.

 12
Author: JBB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-05 20:13:53

Załóżmy, że mamy kolumnę z polem alfanumerycznym posiadającą wpisy typu

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

I chcesz mieć najwyższą wartość liczbową z tej kolumny db (w tym przypadku jest to 9582), wtedy to zapytanie ci pomoże

SELECT Max(column_name) from table_name where column_name REGEXP '^[0-9]+$'
 10
Author: Tarun Sood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-25 08:57:49

Oto proste rozwiązanie przy założeniu, że typem danych jest varchar

select * from calender where year > 0

Zwróci true jeśli rok jest liczbą else false

 8
Author: Jayjitraj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-09 11:37:32

To również działa:

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

Na przykład

SELECT CAST('a123' AS UNSIGNED) // returns 0
SELECT CAST('123' AS UNSIGNED) // returns 123 i.e. > 0
 6
Author: Riad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-24 12:33:40

Aby sprawdzić, czy wartość jest Int w Mysql, możemy użyć następującego zapytania. To zapytanie da wiersze z wartościami Int

SELECT col1 FROM table WHERE concat('',col * 1) = col;
 3
Author: minhas23,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-29 07:36:58

A co z:

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

Do badania liczbowego i korekcyjnego:

WHERE table.field != "0" and CAST(table.field as SIGNED) = 0
 3
Author: Tom Auger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-14 21:56:43

Próbowałem używać wyrażeń regularnych wymienionych powyżej, ale nie działają one dla następujących:

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

Powyższe zwróci 1 (TRUE), oznaczając test ciągu "12 cali" względem powyższego wyrażenia regularnego, zwraca TRUE. Wygląda jak liczba oparta na powyższym wyrażeniu regularnym. W tym przypadku, ponieważ 12 znajduje się na początku łańcucha, Wyrażenie regularne interpretuje go jako liczbę.

Poniższe zwróci właściwą wartość (tj. 0) ponieważ łańcuch zaczyna się od znaków zamiast cyfr

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

Powyższe zwróci 0 (FALSE) ponieważ początek łańcucha jest tekstowy, a nie liczbowy.

Jednakże, jeśli masz do czynienia z ciągami znaków, które mają mieszankę cyfr i liter zaczynających się od liczby, nie otrzymasz pożądanych wyników. REGEXP zinterpretuje łańcuch jako poprawną liczbę, gdy w rzeczywistości nie jest.

 2
Author: Bill Kelly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-17 10:27:41

Najlepsze, co mogłem wymyślić o zmiennej jest int jest kombinacją Z FUNKCJAMI MySQL CAST() i LENGTH().
Ta metoda będzie działać na typach danych typu string, integers, doubles/floats.

SELECT (LENGTH(CAST([data] AS UNSIGNED))) = (LENGTH([data])) AS is_int

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

 1
Author: Raymond Nijland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-18 10:59:37

To działa dobrze dla VARCHAR, gdzie zaczyna się od liczby lub nie..

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

Może mieć ograniczenia, gdy dojdziesz do większej liczby NNNNE+ -

 0
Author: PodTech.io,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-07 12:57:41

Dla mnie działa tylko:

CREATE FUNCTION IsNumeric (SIN VARCHAR(1024)) RETURNS TINYINT
RETURN SIN REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$';

Od kevinclark wszystkie inne zwracane rzeczy dla mnie w przypadku 234jk456 lub 12 inches

 0
Author: Tim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-26 09:31:51