Chỉ CHỌN MySQL không có giá trị null


264

Có thể thực hiện một câu lệnh chọn chỉ lấy các giá trị KHÔNG NULL không?

Ngay bây giờ tôi đang sử dụng này:

SELECT * FROM table

Và sau đó tôi phải lọc các giá trị null bằng một vòng lặp php.

Có cách nào để làm không:

SELECT * (that are NOT NULL) FROM table

?

Ngay bây giờ khi tôi chọn * Tôi nhận được val1, val2, val3, null, val4, val5, null, null, v.v .... nhưng tôi chỉ muốn nhận các giá trị không phải là null trong kết quả của mình. Điều này có thể mà không cần lọc với một vòng lặp?


2
Bạn muốn điều gì xảy ra nếu có một hàng trong đó một số cột có giá trị NULL và các cột khác không có giá trị NULL?
Mark Byers

Tôi muốn chỉ nhận các giá trị từ các cột không phải là null và chỉ trả về các giá trị cột trong hàng không phải là null. Ngay bây giờ tôi sử dụng một vòng lặp để lọc chúng ra, liệu có thể làm điều đó mà không cần một vòng lặp?
bryan sammon

1
@bryan - Cấu trúc bảng của bạn là gì? Có phải tất cả các cột có cùng kiểu dữ liệu?
Martin Smith

1
@bryan - Vậy thì kết quả lý tưởng của bạn sẽ như thế nào? Tập kết quả một cột chứa tất cả các giá trị không null? Nếu không chỉnh sửa câu hỏi của bạn với dữ liệu mẫu và kết quả mong muốn sẽ hữu ích ...
Martin Smith

2
@bryan - Có vẻ như bảng của bạn có thể có các nhóm lặp lại trên các cột? (Xem bài viết Wiki để biết giải thích và cấu trúc thay thế được đề xuất nếu đó là trường hợp en.wikipedia.org/wiki/First_n normal_form )
Martin Smith

Câu trả lời:


453

Bạn nên sử dụng IS NOT NULL. (Các toán tử so sánh =<>cả hai cung cấp UNKNOWNvới NULLở hai bên của biểu thức.)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

Để hoàn thiện, tôi sẽ đề cập rằng trong MySQL, bạn cũng có thể phủ định toán tử đẳng thức an toàn null nhưng đây không phải là SQL chuẩn.

SELECT *
FROM table 
WHERE NOT (YourColumn <=> NULL);

Chỉnh sửa để phản ánh ý kiến. Có vẻ như bảng của bạn có thể không ở dạng bình thường đầu tiên trong trường hợp thay đổi cấu trúc có thể giúp công việc của bạn dễ dàng hơn. Một vài cách khác để làm điều đó mặc dù ...

SELECT val1 AS val
FROM  your_table
WHERE val1 IS NOT NULL
UNION ALL
SELECT val2 
FROM  your_table
WHERE val2 IS NOT NULL
/*And so on for all your columns*/

Nhược điểm ở trên là nó quét bảng nhiều lần một lần cho mỗi cột. Điều đó có thể tránh được bằng cách bên dưới nhưng tôi chưa thử nghiệm điều này trong MySQL.

SELECT CASE idx
         WHEN 1 THEN val1
         WHEN 2 THEN val2
       END AS val
FROM   your_table
        /*CROSS JOIN*/
       JOIN (SELECT 1 AS idx
                   UNION ALL
                   SELECT 2) t
HAVING val IS NOT NULL  /*Can reference alias in Having in MySQL*/

2
Cảm ơn rất nhiều .. Nó đã giúp :)
DfrDkn 7/10/2015

Trong cách tiếp cận cuối cùng, bạn đã sử dụng CASEcâu lệnh, không phải CASEchức năng. Vì vậy, không nên END CASEthay thế END trong SELECT CASE ...một phần?
Istiaque Ahmed

Đối với những người không phải là chuyên gia, bạn có thể giải thích giải pháp cuối cùng? Có phải idx rom đầu tiên SELECTđến từ idxthứ hai SELECT? Những gì CASEtuyên bố cố gắng để thực hiện? Thứ hai SELECTthực sự làm gì? Và bạn đang thực hiện một tham gia nội bộ, không phải tham gia chéo, phải không?
Istiaque Ahmed

Tôi không nghĩ rằng điều này trả lời câu hỏi. Nghe có vẻ như OP muốn chọn (tôi giả sử một hàng cụ thể) nhưng loại trừ tất cả các cột khỏi kết quả đó là null - câu trả lời này yêu cầu bạn chỉ định cột nào không được phép là null (hoàn toàn là một vấn đề khác) hoặc chỉ định tất cả các cột, không phù hợp với các bảng có nhiều cột
csey

(ví dụ: một cái gì đó dọc theo dòng SELECT * FROM table WHERE * IS NOT NULL AND primary_key="somevalue")
csey

18

Bạn có thể lọc ra các hàng có chứa giá trị NULL trong một cột cụ thể:

SELECT col1, col2, ..., coln
FROM yourtable
WHERE somecolumn IS NOT NULL

Nếu bạn muốn lọc ra các hàng có chứa null trong bất kỳ cột nào, hãy thử điều này:

SELECT col1, col2, ..., coln
FROM yourtable
WHERE col1 IS NOT NULL
AND col2 IS NOT NULL
-- ...
AND coln IS NOT NULL

Cập nhật: Dựa trên ý kiến ​​của bạn, có lẽ bạn muốn điều này?

SELECT * FROM
(
    SELECT col1 AS col FROM yourtable
    UNION
    SELECT col2 AS col FROM yourtable
    UNION
    -- ...
    UNION
    SELECT coln AS col FROM yourtable
) T1
WHERE col IS NOT NULL

Và tôi đồng ý với Martin rằng nếu bạn cần làm điều này thì có lẽ bạn nên thay đổi thiết kế cơ sở dữ liệu của mình.


Tôi không chắc là tôi đã giải thích nó đủ tốt chưa, nhưng tôi sẽ cố gắng tốt hơn một chút. Ngay bây giờ khi tôi chọn * Tôi nhận được val1, val2, val3, null, val4, val5, null, null, v.v .... nhưng tôi chỉ muốn nhận các giá trị không phải là null trong kết quả của mình. Điều này có thể mà không cần lọc với một vòng lặp?
bryan sammon

@bryan - Bạn có thể giải thích cột nào *trả về? Có thể cung cấp một chút dữ liệu mẫu trong câu hỏi của bạn vì nó không rõ ràng từ nhận xét của bạn ở trên cho dù đây là tất cả một cột.
Martin Smith

Ngay bây giờ, * trả về tất cả các giá trị của tôi trong hàng. tức là val1, val2, val3, null, val4, val5, null, null. Nhưng tôi muốn nó chỉ trả về các giá trị cột không phải là null. Ngay bây giờ tôi làm điều đó với một vòng lặp để lọc ra các giá trị sau khi nó trả về kết quả.
bryan sammon

13
Select * from your_table 
WHERE col1 and col2 and col3 and col4 and col5 IS NOT NULL;

Nhược điểm duy nhất của phương pháp này là bạn chỉ có thể so sánh 5 cột, sau đó kết quả sẽ luôn là sai, vì vậy tôi chỉ so sánh các trường có thể NULL.


8

Tôi tìm thấy giải pháp này:

Truy vấn này chọn giá trị không cuối cùng cho mỗi cột.

Thí dụ


Nếu bạn có một bảng:

id|title|body
1 |t1   |b1
2 |NULL |b2
3 |t3   |NULL

bạn lấy:

title|body
t3   |b2

Truy vấn


SELECT DISTINCT (

  SELECT title
  FROM test
  WHERE title IS NOT NULL 
  ORDER BY id DESC 
  LIMIT 1
) title, (

  SELECT body
  FROM test
  WHERE body IS NOT NULL 
  ORDER BY id DESC 
  LIMIT 1
) body
FROM test

Tôi hy vọng giúp bạn.


GROUP_CONCAT (cơ thể) NHƯ cơ thể
Ravindra Singh

2

Tôi sử dụng \!lệnh trong MySQL để lấy ra các giá trị NULL từ trình bao:

\! mysql -e "SELECT * FROM table WHERE column = 123456\G" | grep -v NULL

Nó hoạt động tốt nhất với một .my.cnfcơ sở dữ liệu / tên người dùng / mật khẩu được chỉ định. Bằng cách đó bạn chỉ cần bao vây bạn selectvới \! mysql e| grep -v NULL.


1

Theo dõi truy vấn làm việc cho tôi

Khi tôi đã đặt giá trị mặc định của cột 'NULL' thì

select * from table where column IS NOT NULL

và khi tôi đã đặt giá trị mặc định thì không có gì

select * from table where column <>''

0

Có sử dụng NOT NULLtrong truy vấn của bạn như thế này dưới đây.

SELECT * 
FROM table
WHERE col IS NOT NULL;

0

MYSQL KHÔNG PHẢI LÀ NGƯỜI THAM GIA VÀ CHỌN, CHỌN VÀO, XÓA & HOẠT ĐỘNG GIAO DỊCH NHƯ HOẶC, KHÔNG

Using IS NOT NULL On Join Conditions

 SELECT * FROM users 
 LEFT JOIN posts ON post.user_id = users.id 
 WHERE user_id IS NOT NULL;

 Using IS NOT NULL With AND Logical Operator

 SELECT * FROM users 
 WHERE email_address IS NOT NULL 
 AND mobile_number IS NOT NULL;

Using IS NOT NULL With OR Logical Operator

 SELECT * FROM users 
 WHERE email_address IS NOT NULL 
 OR mobile_number IS NOT NULL;

-4
SELECT * FROM TABLE_NAME
where COLUMN_NAME <> '';

2
Đây không phải là chọn trống. câu hỏi là để chọn giá trị không null
krishna
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.