Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách tìm các giá trị không phải dạng số trong một cột trong MySQL

Trong MySQL, bạn có thể chạy một truy vấn như sau để trả về dữ liệu không phải số từ cột.

Điều này có thể hữu ích nếu bạn từng tìm thấy một cột chứa dữ liệu số, nhưng cột đó được thiết lập dưới dạng varchar hoặc char cột. Bạn có thể sử dụng truy vấn này để tìm bất kỳ giá trị không phải số nào có thể đã được chèn vào cột. Sau đó, bạn có thể xử lý nó theo bất kỳ cách nào bạn muốn, chẳng hạn như chuyển đổi chúng thành số, sau đó thay đổi loại cột.

Dữ liệu mẫu

Giả sử chúng ta tạo một bảng như sau:

DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
    c1 varchar(255)
);

INSERT INTO t1 (c1) VALUES 
    ('0'),
    ('1'),
    ('+1'),
    ('-1'),
    ('.5'),
    ('00.00'),
    ('73.45'),
    ('+73.45'),
    ('-73.45'),
    ('.246'),
    ('-.34e7'),
    ('12.e-3'),
    ('1.2e+4'),
    ('a'),
    ('9afc'),
    ('e7'),
    ('+e0'),
    ('Ten'),
    ('5 Dollars');

SELECT * FROM t1;

Bảng đã được tạo và chứa các hàng sau:

+-----------+
| c1        |
+-----------+
| 0         |
| 1         |
| +1        |
| -1        |
| .5        |
| 00.00     |
| 73.45     |
| +73.45    |
| -73.45    |
| .246      |
| -.34e7    |
| 12.e-3    |
| 1.2e+4    |
| a         |
| 9afc      |
| e7        |
| +e0       |
| Ten       |
| 5 Dollars |
+-----------+

Cột là một varchar(255) , vì vậy nó không phải là số. Nó có thể (và không) chứa số nhưng chúng được lưu trữ dưới dạng dữ liệu ký tự. Nó cũng có thể chứa văn bản tùy ý (mà nó có).

Trả lại tất cả các giá trị không phải dạng số

Chúng ta có thể sử dụng truy vấn sau để trả về các giá trị không phải số từ bảng trên:

SELECT c1
FROM t1 
WHERE c1 NOT REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';

Kết quả:

+-----------+
| c1        |
+-----------+
| 12.e-3    |
| a         |
| 9afc      |
| Ten       |
| 5 Dollars |
+-----------+

Trả về số không phải là số nguyên

Nếu chúng ta chỉ muốn trả về các số không phải là số nguyên, thì truy vấn có thể đơn giản hơn rất nhiều:

SELECT c1
FROM t1 
WHERE c1 NOT REGEXP '^[0-9]+$';

Kết quả:

+-----------+
| c1        |
+-----------+
| +1        |
| -1        |
| .5        |
| 00.00     |
| 73.45     |
| +73.45    |
| -73.45    |
| .246      |
| -.34e7    |
| 12.e-3    |
| 1.2e+4    |
| a         |
| 9afc      |
| e7        |
| +e0       |
| Ten       |
| 5 Dollars |
+-----------+

Không chứa dữ liệu số

Nếu chúng tôi chỉ muốn tìm các hàng không chứa bất kỳ dữ liệu số nào, chúng tôi có thể làm như sau:

SELECT c1 
FROM t1 
WHERE c1 NOT REGEXP '[0-9]+';

Kết quả:

+------+
| c1   |
+------+
| a    |
| Ten  |
+------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thay đổi giới hạn cho kích thước Hàng Mysql quá lớn

  2. Mysql chọn riêng biệt

  3. MySQL tải các giá trị NULL từ dữ liệu CSV

  4. PHP &mySQL:Năm 2038 Lỗi:Nó là gì? Làm thế nào để giải quyết nó?

  5. Tôi có thể sử dụng một hàm cho giá trị mặc định trong MySql không?