Làm cách nào để kiểm tra xem một cột trống hay null trong MySQL?


288

Tôi có một cột trong bảng có thể chứa các giá trị null hoặc rỗng. Làm cách nào để kiểm tra xem một cột trống hay null trong các hàng có trong bảng?

(e.g. null or '' or '  ' or '      ' and ...)

1
Mã MySQL: select isnull(mycolumn) from mytabletrả về 1 nếu mycolumn là null.
Eric Leschinski

2
chiều dài (trim (mycolumn))> 0 thì sao?
Cyril Jacquart

Đối với MSSQL> WHERE COLUMN <> '' HOẶC WHERE LEN (COLUMN)> 0 HOẶC NULLIF (LTRIM (RTRIM (COLUMN)), '') KHÔNG PHẢI LÀ NULL
DxTx

Câu trả lời:


444

Điều này sẽ chọn tất cả các hàng nơi some_colNULLhay ''(chuỗi rỗng)

SELECT * FROM table WHERE some_col IS NULL OR some_col = '';

7
Nếu bạn thay đổi điều kiện thành WHERE some_col IS NULL OR some_col = ' '(một khoảng trắng được chèn trong chuỗi) thì nó hoạt động trên cả MySQL và Oracle, xem câu trả lời của "onedaywhen". some_col = ''không hoạt động trên Oracle vì chuỗi rỗng có nghĩa là NULL ở đó.
Johanna

1
@Johanna nhưng nếu bạn chuyển sang ' ', thì nó sẽ không hoạt động trong SQLite. Nó chỉ xử lý khớp chuỗi giống hệt / trực tiếp.
Magne

131

Như được định nghĩa bởi Tiêu chuẩn SQL-92, khi so sánh hai chuỗi có độ rộng khác nhau, giá trị hẹp hơn được đệm bên phải với các khoảng trắng để làm cho nó có cùng chiều rộng với giá trị rộng hơn. Do đó, tất cả các giá trị chuỗi bao gồm toàn bộ khoảng trắng (bao gồm khoảng trắng bằng 0) sẽ được coi là bằng nhau, ví dụ:

'' = ' ' IS TRUE
'' = '  ' IS TRUE
' ' = '  ' IS TRUE
'  ' = '      ' IS TRUE
etc

Do đó, điều này sẽ hoạt động bất kể có bao nhiêu khoảng trắng tạo nên some_colgiá trị:

SELECT * 
  FROM T
 WHERE some_col IS NULL 
       OR some_col = ' ';

hoặc ngắn gọn hơn:

SELECT * 
  FROM T
 WHERE NULLIF(some_col, ' ') IS NULL;

6
Cảm ơn đã đề cập đến các không gian đệm. Bạn có thể thu lợi từ chúng và thay đổi điều kiện thành WHERE some_col IS NULL OR some_col = ' '(một khoảng trắng được chèn trong chuỗi) sau đó nó hoạt động trên cả MySQL và Oracle. some_col = ''không hoạt động trên Oracle vì chuỗi rỗng có nghĩa là NULL ở đó và điều kiện hoàn chỉnh trở thành NULL.
Johanna

Yêu cầu của tôi là tìm SELECT * FROM T WHERE some_col IS NOT NULL OR same_col <> ' '; SELECT * FROM T WHERE NULLIF(some_col, ' ') IS NOT NULL;làm việc cho tôi trong MySQL. Hy vọng điều này sẽ hữu ích.
Dinuka Dayarathna

Thực tế '' = ' 'hoạt động trong SQLServer nhưng không phải trong SQLite, theo như tôi có thể nói, từ việc kiểm tra nó ngay bây giờ.
Magne

66

Một cách ngắn hơn để viết điều kiện:

WHERE some_col > ''

Kể từ khi null > ''sản xuất unknown, điều này có tác dụng lọc cả nullchuỗi và chuỗi rỗng.


2
Có cách nào để đảo ngược điều này, nhận tất cả các bản ghi trong đó là NULL hoặc một chuỗi rỗng?
Joshua Pinter

14
@JoshPinter:coalesce(some_col, '') = ''
Andomar

6
Điều này đôi khi có thể đúng, nhưng không hoạt động trong MySQL 14,14.
Gunnar Þór Magnússon

hoạt động tuyệt vời và trên thực tế là cách duy nhất tôi có thể tìm ra cách lọc cả hai trường rỗng và rỗng trong MariaDB
Neal Davis

1
Tôi sử dụng some_col <> '' để tìm ra mặt trái của điều này
Chargenn

18

Bạn có thể kiểm tra xem một cột có rỗng hay không bằng cách sử dụng WHERE col IS NULLhoặc WHERE col IS NOT NULLvd

SELECT myCol 
FROM MyTable 
WHERE MyCol IS NULL 

Trong ví dụ của bạn, bạn có nhiều hoán vị của khoảng trắng. Bạn có thể loại bỏ khoảng trắng bằng cách sử dụng TRIMvà bạn có thể sử dụng COALESCEđể mặc định giá trị NULL (COALESCE sẽ trả về giá trị không null đầu tiên từ các giá trị bạn cung cấp.

ví dụ

SELECT myCol
FROM MyTable
WHERE TRIM(COALESCE(MyCol, '') = '' 

Truy vấn cuối cùng này sẽ trả về các hàng trong đó MyCollà null hoặc là bất kỳ độ dài nào của khoảng trắng.

Nếu bạn có thể tránh nó, tốt hơn là không có chức năng trên một cột trong mệnh đề WHERE vì điều đó gây khó khăn khi sử dụng một chỉ mục. Nếu bạn chỉ đơn giản muốn kiểm tra xem một cột là rỗng hay trống, bạn có thể nên làm điều này tốt hơn:

SELECT myCol
FROM MyTable
WHERE MyCol IS NULL OR MyCol =  '' 

Xem TRIM COALESCEIS NULL để biết thêm thông tin.

Cũng làm việc với các giá trị null từ các tài liệu MySQL


2
Bạn trình bày giải pháp thực sự một cách rất phức tạp. Trước tiên, bạn trình bày một giải pháp không đầy đủ cho vấn đề của mình "trong đó mycol là null". Sau đó, bạn trình bày một giải pháp bằng cách sử dụng hai hàm lồng nhau trong mệnh đề where, ngay cả khi nói điều này nên tránh. Chỉ sau đó bạn có được giải pháp thực sự. Trong tương lai, trình bày giải pháp thực sự của bạn đầu tiên.

Thiếu một dấu )trước =dấu hiệu trong ví dụ thứ hai của bạn
Rorrim

15

Một phương pháp khác không có WHERE, hãy thử điều này ..

Sẽ chọn cả hai giá trị rỗng và NULL

SELECT ISNULL(NULLIF(fieldname,''))  FROM tablename

Điều này trả về 1 nếu có gì đó null, tại sao lại như vậy?
noobie-php

NULLIF kiểm tra tên trường cho giá trị trống và sẽ chuyển đổi thành NULL nếu nó trống. ISNULL trả về 1 (đúng) nếu NULLIF thành công đã thay đổi một trường trống thành NULL hoặc nếu đó là NULL .... hãy thử tự mình trên một trường rỗng và trống trong một bảng có hai hàm được chọn tách biệt là chọn (X) , chọn nullif (y)
PodTech.io 18/03/2016

9

Hoặc

SELECT IF(field1 IS NULL or field1 = '', 'empty', field1) as field1 from tablename

hoặc là

SELECT case when field1 IS NULL or field1 = ''
        then 'empty'
        else field1
   end as field1 from tablename

6

Tôi ghét các lĩnh vực lộn xộn trong cơ sở dữ liệu của tôi. Nếu cột có thể là một chuỗi trống hoặc null, tôi muốn sửa lỗi này trước khi thực hiện chọn mỗi lần, như sau:

UPDATE MyTable SET MyColumn=NULL WHERE MyColumn='';
SELECT * FROM MyTable WHERE MyColumn IS NULL

Điều này giúp dữ liệu gọn gàng, miễn là bạn không cần phân biệt cụ thể giữa NULL và trống vì một số lý do.



5

Tuyên bố này rõ ràng hơn và dễ đọc hơn đối với tôi:

select * from my_table where ISNULL(NULLIF(some_col, ''));

4

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

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

Dưới đây là ma trận chỉ để hiểu các phương thức đượ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 chuỗi. Mẫu phổ biến nhất đang 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: RTRIM(), LTRIM()

Cách kiểm tra sản phẩm nào / không:

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

Cú pháp cho các hàm trim 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ỉ sử dụng dựa trên hỗ trợ DataBase của bạn. Nó chỉ trả về FirstNametừ UserDetailsbảng nếu nó trốngLastName

Hy vọng điều này sẽ giúp bạn :)


3

Nếu bạn muốn có các giá trị NULL được trình bày lần cuối khi thực hiện ĐẶT HÀNG THEO, hãy thử điều này:

SELECT * FROM my_table WHERE NULLIF(some_col, '') IS NULL;

3

Bạn cũng có thể làm

SELECT * FROM table WHERE column_name LIKE ''

Các sinh vật nghịch đảo

SELECT * FROM table WHERE column_name NOT LIKE ''

Rõ ràng không hoạt động: select NULL like ''trả về NULL- ít nhất là trong MySQL.
Tít

2
SELECT * FROM tbl WHERE trim(IFNULL(col,'')) <> '';

Tôi đã có một vấn đề so với một lĩnh vực đôi khi là null. Điều này đã giúp:col1 != IFNULL(col2,'')
webaholik

1

Kiểm tra null

$column is null
isnull($column)

Kiểm tra trống

$column != ""

Tuy nhiên, bạn phải luôn đặt KHÔNG NULL cho cột,
tối ưu hóa mysql chỉ có thể xử lý một cấp IS NULL


3
Không bao giờ chấp nhận NULLcác giá trị là một chủ đề khác để thảo luận. Tôi không nghĩ rằng nó phù hợp để đưa ra khuyến nghị mà không cung cấp lý do của bạn.
maček

Tôi đã bao gồm, hãy kiên nhẫn. Plus thực sự làm cho cuộc sống khó khăn khi sử dụng NULL (giống như câu hỏi này).
ajreal

5
Đó là một đề nghị khủng khiếp. Đặt KHÔNG NULL trên một cột có giá trị có thể không được biết tại thời điểm INSERT chỉ phục vụ để khuyến khích sử dụng các giá trị "null" không chuẩn như -1''.
Dan Bechard

@ Nếu bạn không chắc giá trị trong khi chèn là gì, bạn có thể gặp khó khăn khi thực hiện bất kỳ tối ưu hóa sở hữu nào
ajreal

0
select * from table where length(RTRIM(LTRIM(column_name))) > 0

1
Điểm nào trong việc sử dụng cả hai RTRIMLTRIM, nhưng không TRIM?
Nico Haase

0

Trong trường hợp của tôi, không gian được nhập vào cột trong quá trình nhập dữ liệu và mặc dù nó trông giống như một cột trống, chiều dài của nó là 1. Vì vậy, trước hết tôi đã kiểm tra độ dài của cột trông trống bằng cách sử dụng length(column)truy vấn tìm kiếm này.

CHỌN * TỪ BẢNG WHERE LENGHT (COLUMN) = chiều dài cột cho cột trống


-1

hãy thử điều này nếu kiểu dữ liệu là chuỗi và hàng là null

SELECT * FROM table WHERE column_name IS NULL OR column_name = ''

nếu kiểu dữ liệu là int hoặc cột bằng 0 thì hãy thử điều này

SELECT * FROM table WHERE column_name > = 0

-2
SELECT column_name FROM table_name WHERE column_name IN (NULL, '')

1
Câu trả lời sai. Điều này sẽ không chọn NULL.
Pang
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.