2008-09-16 56 views
99

Tôi thấy rằng trong MySQL có các hàm Cast()Convert() để tạo số nguyên từ các giá trị, nhưng có cách nào để kiểm tra xem liệu giá trị có phải là số nguyên không? Một cái gì đó như is_int() trong PHP là những gì tôi đang tìm kiếm.Làm cách nào để kiểm tra xem liệu giá trị có phải là số nguyên trong MySQL không?

+1

nên buồn bã chúng ta phải tạo is_int() chức năng trong Mysql –

Trả lời

172

Tôi giả sử bạn muốn kiểm tra giá trị chuỗi. Một cách tốt đẹp là toán tử REGEXP, khớp chuỗi với một biểu thức chính quy. Chỉ cần thực hiện

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

điều này là khá nhanh. Nếu trường của bạn là số, chỉ cần thử nghiệm cho

ceil(field) = field 

thay thế.

+3

Các 'ceil (lĩnh vực) = trường' thử nghiệm là một ý tưởng hay, nhưng như @ Jumpy đã chỉ ra, nó không thành công trên dữ liệu phi số: SELECT ceil ('bốn') = 'bốn'; -> 1 –

+1

@MatthewCornell, Anh ấy nói nếu trường của bạn là số. Đó là để bạn có thể kiểm tra nếu một số là một số nguyên. Nó sẽ không hoạt động trên dây, đó là lý do tại sao tùy chọn đầu tiên là có. – Malfist

+0

Nếu dữ liệu có thể bao gồm khoảng trắng, điều này sẽ không thành công. Xem xét thử nghiệm trim (trường), có thể với một arg thêm để loại bỏ newlines. –

10

Khớp với biểu thức chính quy.

c.f. http://forums.mysql.com/read.php?60,1907,38488#msg-38488 như được trích dẫn bên dưới:

Điều khoản IsNumeric() trong MySQL ??
Đăng bởi: kevinclark()
ngày: 8 tháng 8 năm 2005 13:01


Tôi đồng ý. Đây là một chức năng tôi đã tạo cho 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]+)$'; 


Điều này cho phép một dấu hiệu bắt buộc cộng/trừ ngay từ đầu, một dấu thập phân tùy chọn và ký tự số còn lại.

+0

Cảm ơn, giải pháp của bạn sẽ chăm sóc của số thập phân cũng – Ananda

7

Dưới đây là giải pháp đơn giản cho nó giả định kiểu dữ liệu là varchar

select * from calender where year > 0 

Nó sẽ trả về true nếu năm là số khác sai

+27

Trong varchar, điều này cũng sẽ trả về true nếu ký tự đầu tiên là số. – TuK

+0

Không nhận thấy điều đó. bình chọn bình luận của bạn :) – Jayjitraj

1

Tôi đã cố gắng sử dụng các biểu thức thông thường được liệt kê ở trên, nhưng họ không làm việc sau:

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

trên sẽ trở 1 (TRUE), có nghĩa là kiểm tra chuỗi '12 INCHES 'so với cụm từ thông dụng ở trên, trả về TRUE. Nó trông giống như một số dựa trên biểu thức chính quy được sử dụng ở trên. Trong trường hợp này, vì 12 là ở đầu chuỗi, cụm từ thông dụng diễn giải nó dưới dạng một số.

Sau đây sẽ trả về giá trị đúng (ví dụ 0) vì chuỗi bắt đầu với ký tự thay vì các chữ số

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

trên sẽ trở 0 (FALSE) vì đầu của chuỗi là văn bản và không số .

Tuy nhiên, nếu bạn đang xử lý các chuỗi có kết hợp các số và chữ cái bắt đầu bằng một số, bạn sẽ không nhận được kết quả mong muốn. REGEXP sẽ giải thích chuỗi là một số hợp lệ khi thực tế nó không phải là.

+1

Điều này là không chính xác. Bạn đã thử nó chưa? Khi tôi chạy ví dụ đầu tiên của bạn, nó trả về 'FALSE', như mong đợi, bởi vì regex kết thúc bằng' $ 'có nghĩa là kết thúc của chuỗi, vì vậy nó chỉ kiểm tra các số, theo dự định của tác giả. – spikyjt

2

gì về:

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

để kiểm tra số và corrolary:

WHERE table.field != "0" and CAST(table.field as SIGNED) = 0 
+1

CAST (table.field)! = 0 sẽ không hoạt động vì nó cần loại để truyền. – Riad

+0

Điều này hoạt động hoàn hảo nếu bạn cần kiểm tra các mục không phải là số, điều này xứng đáng nhận được nhiều +1 hơn. Các câu trả lời khác khó đảo ngược bài kiểm tra hơn để tìm các mục không phải là số. – DrCord

+0

Điều này không hoạt động đối với các số như "0000", "0" (khoảng trắng) và "7x" (được coi là số). –

9

Giả sử chúng ta đã cột với mục lĩnh vực có chữ và số như

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

và bạn muốn cao nhất giá trị số từ cột db này (trong trường hợp này là 9582) thì truy vấn này sẽ giúp bạn

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

* '10000' * là cao hơn, nhưng truy vấn của bạn vẫn sẽ trở lại * '9582' *. –

5

này cũng hoạt động:

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

ví dụ

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

Còn 'SELECT CAST ('12a34' AS UNSIGNED)', trả về '12' thì sao? –

+1

Điều này hoạt động hoàn hảo nếu bạn cần kiểm tra các mục không phải là số, điều này xứng đáng được +1 nhiều hơn. Các câu trả lời khác khó đảo ngược bài kiểm tra hơn để tìm các mục không phải là số. – DrCord

+1

@DrCord điều này không làm việc cho trường hợp Mike C mô tả, do đó là rất không đáng tin cậy – jontro

2

Để kiểm tra xem một giá trị là Int trong Mysql, chúng ta có thể sử dụng các truy vấn sau đây. Truy vấn này sẽ cung cấp cho các hàng với Int giá trị

SELECT col1 FROM table WHERE concat('',col * 1) = col; 
+0

Câu trả lời này làm việc cho tôi. – Pupil

+0

Điều này cũng sẽ chọn các số không phải số nguyên (ví dụ: * '3.5' *). –

0

này hoạt động tốt cho VARCHAR nơi nó bắt đầu với một số hay không ..

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

có thể có những hạn chế khi bạn nhận được để càng lớn NNNNE + - số

0

đối với tôi là điều duy nhất mà làm việc là:

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

từ kevinclark tất cả trở lại thứ vô ích khác đối với tôi trong trường hợp 234jk456 hay 12 inches

Các vấn đề liên quan