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

Tìm các giá trị không phải số trong một cột trong SQL Server

Có thể có những trường hợp bạn cần kiểm tra một cột để tìm các giá trị không phải số. Ví dụ:bạn phát hiện ra rằng một cột là varchar khi nó thực sự phải là cột số.

Điều này có thể dễ dàng thực hiện trong SQL Server với ISNUMERIC() chức năng.

Dữ liệu mẫu

Giả sử chúng ta tạo một bảng với varchar và chèn dữ liệu như sau:

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

INSERT INTO t1 (c1) VALUES 
    ('0'),
    ('1'),
    ('+1'),
    ('-1'),
    ('+1'),
    ('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;

Kết quả:

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

Hầu hết các giá trị trên đều là số, mặc dù chúng nằm trong varchar cột. Các ví dụ sau kiểm tra cột này để tìm các giá trị không phải số.

ISNUMERIC() Chức năng

SELECT c1
FROM t1
WHERE ISNUMERIC(c1) <> 1;

Kết quả:

+-----------+
| c1        |
|-----------|
| a         |
| 9afc      |
| e7        |
| +e0       |
| Ten       |
| 5 Dollars |
+-----------+

Ở đây, tôi đã sử dụng ISNUMERIC() cùng với chức năng Not Equal To (<> ) để kiểm tra các giá trị không phải là số.

Có thể có một lý do chính đáng để một cột là varchar thay vì số. Nhưng nếu không, các giá trị phải được chuyển đổi thành các giá trị tương đương số của chúng và sau đó, kiểu dữ liệu của cột sẽ được thay đổi thành kiểu số. Điều này sẽ giúp duy trì tính toàn vẹn dữ liệu của cơ sở dữ liệu.

Tìm các giá trị không chứa bất kỳ số nào

Chúng tôi có thể sử dụng truy vấn sau để trả về tất cả các hàng không chứa giá trị số.

SELECT c1
FROM t1 
WHERE c1 NOT LIKE '%[0-9]%';

Kết quả:

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

Đây là một kết quả khác với ví dụ trước đó, bởi vì chúng tôi chỉ đơn giản là đang tìm kiếm tất cả các giá trị không chứa bất kỳ dữ liệu số nào. Trong ví dụ trước, chúng tôi đang tìm kiếm những giá trị không phải là số.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2016:Tạo đăng nhập

  2. Theo dõi tuổi thọ trang trong SQL Server

  3. Làm thế nào để ánh xạ động các cột đầu vào và đầu ra trong SSIS?

  4. Xoay vòng bằng SQL Server 2000

  5. Cách gỡ cài đặt SQL Server Management Studio (SSMS) - Hướng dẫn SQL Server / TSQL Phần 23.1