Liệu mysql có một funcion như is_num() có thể cho phép tôi xác định dữ liệu là số hay không?Làm thế nào để chỉ chọn dữ liệu số từ mysql?
Cảm ơn.
Liệu mysql có một funcion như is_num() có thể cho phép tôi xác định dữ liệu là số hay không?Làm thế nào để chỉ chọn dữ liệu số từ mysql?
Cảm ơn.
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)
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 |
+--------+
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)
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;
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;
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ả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. –
@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