Làm thế nào để kiểm tra các giá trị null / rỗng / khoảng trắng với một lần kiểm tra?


88

Tôi muốn viết một câu lệnh SELECT chỉ sử dụng một phép thử để trả về các cột không có giá trị (null, rỗng hoặc tất cả các khoảng trắng).

Tôi nghĩ điều này sẽ hoạt động:

SELECT column_name from table_name WHERE column_name NOT LIKE '%_%';

Nhưng điều này không hoạt động đối với các giá trị NULL.

Tất nhiên tôi có thể thêm

OR column_name IS NULL

và nó sẽ hoạt động, nhưng tôi muốn một cách sử dụng một bài kiểm tra duy nhất.



Có phải là không mong muốn có nhiều bài kiểm tra? tức là chi tiết hơn = phản hồi tốt hơn cho người dùng về cách sửa dữ liệu.
ngày

@onedaywhen: Nói chung có thể tốt hơn nếu có nhiều chi tiết hơn, nhưng tôi đang làm việc với cơ sở mã hiện có và tôi muốn bắt chước cấu trúc mã hiện có càng chặt chẽ càng tốt. Mã hiện tại chỉ thực hiện một thử nghiệm, vì vậy tôi đang tìm kiếm một giải pháp cũng chỉ có một thử nghiệm.
John Gordon

Câu trả lời:


99

Về mặt chức năng, bạn có thể sử dụng

SELECT column_name
  FROM table_name
 WHERE TRIM(column_name) IS NULL

Vấn đề là một chỉ mục trên COLUMN_NAME sẽ không được sử dụng. Bạn sẽ cần phải có một chỉ mục dựa trên hàm trên TRIM (column_name) nếu đó là một điều kiện chọn lọc.


32
Lưu ý cho người dùng T-SQL: không có TRIM, bạn sẽ cần LTRIM hoặc RTRIM.
Devilcodemonkey

11
Kể từ SQL Server 2017 có một chức năng TRIM. Nguồn
bvwidt

1
@ EhMann365 câu hỏi này là về Oracle, không phải Sql Server.
MH

11
RTRIM (LTRIM (column_name)) - Dành cho Người dùng Microsft SQL.
DxTx

4
Trong Sql Server TRIM (column_name) trả về chuỗi trống '', không phải NULL. Các câu trả lời khác hỗ trợ cả chuỗi trống và NULL
Michael Freidgeim

25
SELECT column_name from table_name
WHERE RTRIM(ISNULL(column_name, '')) LIKE ''

ISNULL(column_name, '') sẽ trả về '' nếu column_name là NULL, nếu không nó sẽ trả về column_name.

CẬP NHẬT

Trong Oracle, bạn có thể sử dụng NVLđể đạt được kết quả tương tự.

SELECT column_name from table_name
WHERE RTRIM(NVL(column_name, '')) LIKE ''

3
thực này vẫn không làm việc tại Oracle, Oracle đối xử với chuỗi rỗng như NULL, do đó bạn có thể không có một điều khoản "không giống như ''" vì nó so sánh với một giá trị null
Harrison

Tôi có muốn THÍCH '' thay vì KHÔNG THÍCH '' không?
John Gordon

Vâng, xin lỗi, đọc sai câu hỏi ban đầu là muốn mọi thứ có giá trị. Nhưng như tanging đã chỉ ra, có vẻ như điều này sẽ không hoạt động trong Oracle.
GendoIkari

Vì tôi đang sử dụng Oracle, có vẻ như tôi có thể sử dụng WHERE TRIM (col) IS NULL và điều đó sẽ xử lý các giá trị rỗng, trống và khoảng trắng.
John Gordon

Rõ ràng, phần đầu tiên là mất tích một dấu ngoặc đơn, nó phải là:WHERE RTRIM(ISNULL(column_name, '')) LIKE ''
Serj Sagan

14

Hàm NULLIF sẽ chuyển đổi bất kỳ giá trị cột nào chỉ có khoảng trắng thành giá trị NULL. Hoạt động cho T-SQL và SQL Server 2008 trở lên.

SELECT [column_name]
FROM [table_name]
WHERE NULLIF([column_name], '') IS NULL

1
Một câu trả lời hay sẽ chứa một lời giải thích về mã và tại sao nó được viết theo cách này. Tôi khuyên bạn nên cập nhật câu trả lời của mình :-)
Qirel

1
Mục đích của điều này là gì? Sẽ hiệu quả hơn nếu chỉ đặt nó thành [column_name] LIKE ''
SILENT

Nó cần TRIM để hỗ trợ nhiều khoảng trắng
Michael Freidgeim

1
Thử nghiệm trên SQL Server 2017, điều này hoạt động đối với nhiều khoảng trắng mà không có TRIM. Nó không có ý nghĩa đối với tôi, bởi vì theo tài liệu NULLIF chỉ nên trả về NULL nếu hai biểu thức bằng nhau và một chuỗi dấu cách thường không bằng một chuỗi rỗng. (Tôi chỉ kiểm tra dấu cách, không phải tab, dòng mới hoặc các ký tự khoảng trắng khác.)
Jovie

1
@Jovie SQL Server đôi khi bỏ qua khoảng trắng ở cuối, hãy đọc: stackoverflow.com/questions/17876478/…
Brian MacKay

7

Trong khi kiểm tra null or Emptygiá trị cho một cột, tôi nhận thấy rằng có một số mối quan tâm về hỗ trợ trong các Cơ sở dữ liệu khác nhau.

Mọi Cơ sở dữ liệu không hỗ trợ TRIM phương pháp.

Dưới đây là ma trận chỉ để hiểu các phương pháp được hỗ trợ bởi các cơ sở dữ liệu khác nhau.

Hàm TRIM trong SQL được sử dụng để loại bỏ tiền tố hoặc hậu tố được chỉ định khỏi một chuỗi. Mô hình phổ biến nhất bị loại bỏ là khoảng trắng. Hàm này được gọi khác nhau trong các cơ sở dữ liệu khác nhau:

  • MySQL: TRIM(), RTRIM(), LTRIM()
  • Oracle: RTRIM(), LTRIM()
  • Máy chủ SQL: TRIM(), RTRIM(), LTRIM()

Cách kiểm tra Khoảng trống / Null / Khoảng trắng: -

Dưới đây là hai cách khác nhau tùy theo các Cơ sở dữ liệu khác nhau-

Cú pháp cho các hàm cắt này là:

  1. Sử dụng Trim để kiểm tra-

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

  2. Sử dụng LTRIM & RTRIM để kiểm tra-

    SELECT FirstName FROM UserDetails WHERE LTRIM(RTRIM(LastName)) IS NULL

Trên cả hai cách đều cung cấp kết quả giống nhau, chỉ cần sử dụng dựa trên hỗ trợ DataBase của bạn. Nó chỉ trả về bảng FirstNamefrom UserDetailsnếu nó có giá trị trốngLastName

Hy vọng điều này cũng sẽ giúp ích cho những người khác :)


VỚI t as (select '' c union all select '' c union all select NULL) SELECT * FROM t WHERE LTRIM (RTRIM (c)) IS NULL; không trở lại 3 hồ sơ trên SQL server
Waqar

5
Tại sao cần cả L & RTRIM? Sẽ không chỉ một trong các hàm đủ để kiểm tra xem cột có trống không?
SILENT

4

Truy vấn phpMyAdmin này trả về những hàng KHÔNG rỗng hoặc trống hoặc chỉ là khoảng trắng:

SELECT * FROM `table_name` WHERE NOT ((`column_name` IS NULL) OR (TRIM(`column_name`) LIKE ''))

nếu bạn muốn chọn các hàng rỗng / trống / chỉ có khoảng trắng, chỉ cần loại bỏ KHÔNG.


2

Sử dụng truy vấn dưới đây và nó hoạt động

SELECT column_name FROM table_name where isnull(column_name,'') <> ''

0

Những gì tôi sử dụng IsNotNullOrEmptyOrWhiteSpacetrong T-SQL là:

SELECT [column_name] FROM [table_name]
WHERE LEN(RTRIM(ISNULL([column_name], ''))) > 0

0

Mỗi người đề xuất chạy một truy vấn trong Oracle để tìm các bản ghi có trường cụ thể chỉ là trống, (trường này không bao gồm (null) hoặc bất kỳ trường nào khác chỉ là một dòng trống) đã không hoạt động. Tôi đã thử mọi mã đề xuất. Đoán tôi sẽ tiếp tục tìm kiếm trực tuyến.

***** CẬP NHẬT *****

Tôi đã thử điều này và nó hoạt động, không chắc tại sao nó sẽ không hoạt động nếu <1 nhưng vì lý do nào đó <2 hoạt động và chỉ trả về các bản ghi có trường chỉ trống

chọn [columnName] từ [tableName] trong đó LENGTH (columnName) <2;

Tôi đoán bất kỳ tập lệnh nào được sử dụng để chuyển đổi dữ liệu đã để lại một thứ gì đó trong trường mặc dù nó hiển thị trống, đó là suy đoán của tôi về lý do tại sao <2 hoạt động nhưng không phải <1

Tuy nhiên, nếu bạn có bất kỳ giá trị nào khác trong trường cột đó ít hơn hai ký tự thì bạn có thể phải đưa ra giải pháp khác. Nếu không có nhiều ký tự khác thì bạn có thể tách chúng ra.

Hy vọng một ngày nào đó giải pháp của tôi sẽ giúp ích cho người khác.


-3

Như trong Oracle, bạn có thể sử dụng hàm NVL trong MySQL, bạn có thể sử dụng IFNULL (columnaName, newValue) để đạt được kết quả mong muốn của bạn như trong ví dụ này

SELECT column_name from table_name WHERE IFNULL(column_name,'') NOT LIKE '%_%';

-4

bạn có thể dùng

SELECT [column_name] 
FROM [table_name]
WHERE [column_name] LIKE '% %' 
OR [column_name] IS NULL
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.