Tôi thấy rằng trong MySQL có các hàm Cast()
và Convert()
để tạo số nguyên từ các giá trị, nhưng có cách nào để kiểm tra xem giá trị có phải là số nguyên không? Một cái gì đó như is_int()
in PHP là thứ tôi đang tìm kiếm.
Tôi sẽ giả sử bạn muốn kiểm tra một giá trị chuỗi. Một cách hay là toán tử REGEXP, khớp chuỗi với biểu thức chính quy. Đơn giản chỉ cần làm
select field from table where field REGEXP '^-?[0-9]+$';
điều này là hợp lý nhanh chóng. Nếu trường của bạn là số, chỉ cần kiểm tra
ceil(field) = field
thay thế.
Kết hợp nó với một biểu thức thông thường.
c.f. http://forums.mysql.com/read.php?60,1907,38488#msg-38488 như được trích dẫn dưới đây:
Re: mệnh đề IsNumeric () trong MySQL ??
[.__.] Đăng bởi: kevinclark ()
[.__.] Ngày: 08 tháng 8 năm 2005 01:01 PM
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 có dấu cộng/dấu tùy chọn ở đầu, một dấu thập phân tùy chọn và các chữ số còn lại.
Giả sử chúng ta có cột với trường chữ và số có các mục như
a41q
1458
xwe8
1475
asde
9582
.
.
.
.
.
qe84
và bạn muốn giá trị số cao nhất 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]+$'
Đây là giải pháp đơn giản cho nó giả sử 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
Điều 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
Để kiểm tra xem một giá trị có phải là Int trong Mysql không, chúng ta có thể sử dụng truy vấn sau. Truy vấn này sẽ cung cấp các hàng có giá trị Int
SELECT col1 FROM table WHERE concat('',col * 1) = col;
Thế còn:
WHERE table.field = "0" or CAST(table.field as SIGNED) != 0
để kiểm tra số và độ chính xác:
WHERE table.field != "0" and CAST(table.field as SIGNED) = 0
Điều tốt nhất tôi có thể nghĩ về một biến là một int Là sự kết hợp với các chức năng của MySQL CAST()
và LENGTH()
.
[.___.] Phương pháp này sẽ hoạt động trên các chuỗi, số nguyên, kiểu dữ liệu nhân đôi/float.
SELECT (LENGTH(CAST(<data> AS UNSIGNED))) = (LENGTH(<data>)) AS is_int
xem bản demo http://sqlfiddle.com/#!9/ff40cd/44
nó sẽ thất bại nếu cột có một giá trị ký tự. nếu cột có giá trị 'A' thì Cast ('A' là UNSIGNED) sẽ đánh giá thành 0 và LENGTH (0) sẽ là 1. vì vậy LENGTH (Cast ('A' là UNSIGNED)) = LENGTH (0) sẽ đánh giá 1 = 1 => 1
Đúng là Waqas Malik hoàn toàn mù mờ để kiểm tra trường hợp đó. các bản vá là.
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;
Kết quả
**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 |
xem bản demo
Tôi đã thử sử dụng các biểu thức chính quy được liệt kê ở trên, nhưng chúng không hoạt động cho các mục sau:
SELECT '12 INCHES' REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$' FROM ...
Ở trên sẽ trả về 1
(TRUE
), nghĩa là kiểm tra chuỗi '12 INCHES 'so với biểu thức thông thường ở trên, trả về TRUE
. Có vẻ như một số dựa trên biểu thức thông thường được sử dụng ở trên. Trong trường hợp này, vì số 12 nằm ở đầu chuỗi, biểu thức chính quy diễn giải nó dưới dạng số.
Sau đây sẽ trả về giá trị đúng (nghĩa là 0
) vì chuỗi bắt đầu bằng ký tự thay vì chữ số
SELECT 'TOP 10' REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$' FROM ...
Ở trên sẽ trả về 0
(FALSE
) vì phần đầu của chuỗi là văn bản và không phải là số.
Tuy nhiên, nếu bạn đang xử lý các chuỗi có kết hợp số và chữ bắt đầu bằng một số, bạn sẽ không nhận được kết quả như mong muốn. REGEXP sẽ diễn giải chuỗi là một số hợp lệ trong khi thực tế nó không phải là số.
Điều này hoạt động tốt cho VARCHAR khi nó bắt đầu bằng một số hoặc không ..
WHERE concat('',fieldname * 1) != fieldname
có thể có các hạn chế khi bạn nhận được số NNNNE + - lớn hơn
đối với tôi điều duy nhất hoạt động 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ả những thứ vô dụng khác trả lại cho tôi trong trường hợp 234jk456
hoặc 12 inches