2010-05-03 15 views

Trả lời

6

Bạn có thể muốn tạo một người dùng chức năng được xác định phù hợp với giá trị so với một biểu thức chính quy:

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

Nguồn: MySQL Forums :: Microsoft SQL Server :: IsNumeric() clause in MySQL?


thử nghiệm Truthy:

mysql> SELECT ISNUMERIC('1'); 
+----------------+ 
| ISNUMERIC('1') | 
+----------------+ 
|    1 | 
+----------------+ 
1 row in set (0.01 sec) 

mysql> SELECT ISNUMERIC(25); 
+---------------+ 
| ISNUMERIC(25) | 
+---------------+ 
|    1 | 
+---------------+ 
1 row in set (0.00 sec) 

mysql> SELECT ISNUMERIC('-100'); 
+-----------------+ 
| ISNUMERIC(-100) | 
+-----------------+ 
|    1 | 
+-----------------+ 
1 row in set (0.03 sec) 

mysql> SELECT ISNUMERIC('1.5'); 
+------------------+ 
| ISNUMERIC('1.5') | 
+------------------+ 
|    1 | 
+------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT ISNUMERIC('-1.5'); 
+-------------------+ 
| ISNUMERIC('-1.5') | 
+-------------------+ 
|     1 | 
+-------------------+ 
1 row in set (0.02 sec) 

Falsy Kiểm tra:

mysql> SELECT ISNUMERIC('a'); 
+----------------+ 
| ISNUMERIC('a') | 
+----------------+ 
|    0 | 
+----------------+ 
1 row in set (0.02 sec) 

mysql> SELECT ISNUMERIC('a1'); 
+-----------------+ 
| ISNUMERIC('a1') | 
+-----------------+ 
|    0 | 
+-----------------+ 
1 row in set (0.00 sec) 

mysql> SELECT ISNUMERIC('10a'); 
+------------------+ 
| ISNUMERIC('10a') | 
+------------------+ 
|    0 | 
+------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT ISNUMERIC('0.a'); 
+------------------+ 
| ISNUMERIC('0.a') | 
+------------------+ 
|    0 | 
+------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT ISNUMERIC('a.0'); 
+------------------+ 
| ISNUMERIC('a.0') | 
+------------------+ 
|    0 | 
+------------------+ 
1 row in set (0.00 sec) 
5

Trong trường hợp của tôi, tôi chỉ cần thiết để kiểm tra xem dữ liệu là> = 0 và không char, có lẽ đây là hữu ích cho bạn thêm:

mysql> select '1' REGEXP '^[0-9]+$' as result; 
+--------+ 
| result | 
+--------+ 
|  1 | 
+--------+ 
1 row in set (0.16 sec) 

mysql> select '1a' REGEXP '^[0-9]+$' as result; 
+--------+ 
| result | 
+--------+ 
|  0 | 
+--------+ 
1

Nếu bạn muốn chọn những chữ số từ chuỗi của bạn , hãy thử sử dụng này:

CREATE FUNCTION IsNumeric (val varchar(255)) RETURNS tinyint 
RETURN val REGEXP '^(-|\\+){0,1}([0-9]+\\.[0-9]*|[0-9]*\\.[0-9]+|[0-9]+)$'; 

CREATE FUNCTION NumericOnly (val VARCHAR(255)) 
RETURNS VARCHAR(255) 
BEGIN 
DECLARE idx INT DEFAULT 0; 
IF ISNULL(val) THEN RETURN NULL; END IF; 

IF LENGTH(val) = 0 THEN RETURN ""; END IF; 

SET idx = LENGTH(val); 
    WHILE idx > 0 DO 
    IF IsNumeric(SUBSTRING(val,idx,1)) = 0 THEN 
    SET val = REPLACE(val,SUBSTRING(val,idx,1),""); 
    SET idx = LENGTH(val)+1; 
    END IF; 
    SET idx = idx - 1; 
    END WHILE; 
    RETURN val; 
END; 

sử dụng nó bằng cách gọi hàm NumericOnly như thế này:

select NumericOnly('1&2') as result; 

Returns: "12"

select NumericOnly('abc987') as result; 

Returns: "987"

(BTW, tôi đã viết một post about this here)

+0

Cảm ơn bạn đã giải pháp nhưng đã xảy ra lỗi chính tả. Thay đổi như sau: SET idx = REPLACE (val, ".", ""); để SET val = REPLACE (val, ".", ""); Sau đó, nó hoạt động như ma thuật. –

+0

@Raj - Tôi đã tiếp tục và xóa dòng đó. Tôi không nghĩ rằng nó giúp.Nó sẽ chỉ được gỡ bỏ trong vòng "WHILE" anyway. – VenerableAgents

1

Chỉ cần chuyển đổi dữ liệu của bạn một cách rõ ràng đối với một số sử dụng thập phân hoặc KÝ/UNSIGNED và sử dụng STRCMP để so sánh với giá trị dữ liệu gốc. Nếu STRCMP trả về 0 (bình đẳng) thì bạn biết bạn có một số. Nếu không, nó không phải.

Dưới đây là ví dụ giả định không có vị trí thập phân trong dữ liệu của bạn khi dữ liệu là số, vì vậy chúng tôi có thể truyền dưới dạng DECIMAL.

Truy vấn này chọn tất cả các hàng có chứa dữ liệu số trong trường is_it_a_number.

SELECT * FROM my_table WHERE 
    STRCMP(CAST(my_table.is_it_a_number AS DECIMAL(10,0)), my_table.is_it_a_number) = 0; 
0

Cú pháp đơn giản cho IsNumeric từ SQL để MYSQL là

sql:

SELECT isNumeric(col_name) FROM Table where isNumeric(col_name) <> 0 

Mysql nhanh

select concat('',col_name * 1) from table where concat('',col_name * 1) <> 0; 
0

Ngàn lần.

DROP FUNCTION IF EXISTS NumericOnly; 
DELIMITER $$ 
CREATE FUNCTION NumericOnly(val VARCHAR(25)) RETURNS VARCHAR(25) 
BEGIN 
DECLARE idx INT DEFAULT 0; 
    IF ISNULL(val) THEN RETURN NULL; END IF; 
    IF LENGTH(val) = 0 THEN RETURN ""; END IF; 

SET idx = LENGTH(val); 
    WHILE idx > 0 DO 
    IF (SUBSTRING(val,idx,1) in ('0','1','2','3','4','5','6','7','8','9')) = 0 THEN 
    SET val = CONCAT(SUBSTRING(val, 1, idx-1), SUBSTRING(val FROM idx + 1)); 
    END IF; 
    SET idx = idx - 1; 
    END WHILE; 
    RETURN val; 
END; 
$$ 
DELIMITER ; 
Các vấn đề liên quan