web-development-kb-asia.site

Làm cách nào để kiểm tra xem giá trị có phải là số nguyên trong MySQL không?

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 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.

107
Craig Nakamoto

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ế.

192
Jumpy

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.

13
JBB

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]+$'
10
Tarun Sood

Đâ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

8
Jayjitraj

Đ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
6
Riad

Để 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;
4
minhas23

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
3
Tom Auger

Đ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()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

2
Raymond Nijland

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ố.

2
Bill Kelly

Đ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

0
PodTech.io

đố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

0
Tim