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

MySql, Postgres, Oracle và SQLServer bỏ qua bộ lọc KHÔNG ĐẦY ĐỦ

Để bỏ qua hàng khỏi kết quả nếu có trong nguồn các hàng cho cùng một id có giá trị value IS NULL , một giải pháp trong Postgres sẽ sử dụng hàm tổng hợp every() hoặc (từ đồng nghĩa với lý do lịch sử) bool_and() trong HAVING mệnh đề:

SELECT id
     , max(case when colID = 1 then value else '' end) AS fn
     , max(case when colID = 2 then value else '' end) AS ln
     , max(case when colID = 3 then value else '' end) AS jt
FROM   tbl 
GROUP  BY id
HAVING every(value IS NOT NULL);

SQL Fiddle.

Giải thích

Nỗ lực của bạn với WHERE mệnh đề sẽ chỉ loại bỏ một hàng nguồn cho id = 3 trong ví dụ của bạn (ví dụ có colID = 1 ), để lại hai cái nữa cho cùng một id . Vì vậy, chúng tôi vẫn nhận được một hàng cho id = 3 trong kết quả sau khi tổng hợp.

Nhưng vì chúng ta không có hàng nào có colID = 1 , chúng tôi nhận được một chuỗi trống (lưu ý:không phải là NULL value!) cho fn trong kết quả cho id = 3 .

Một giải pháp nhanh hơn trong Postgres sẽ là sử dụng crosstab() . Chi tiết:

RDBMS khác

Trong khi EVERY được định nghĩa trong tiêu chuẩn SQL:2008, nhiều RDBMS không hỗ trợ nó, có lẽ là do một số trong số chúng có triển khai kiểu boolean mờ ám. (Không bỏ bất kỳ tên nào như "MySQL" hoặc "Oracle" ...). Bạn có thể thay thế ở mọi nơi (kể cả Postgres) bằng:

SELECT id
     , max(case when colID = 1 then value else '' end) AS fn
     , max(case when colID = 2 then value else '' end) AS ln
     , max(case when colID = 3 then value else '' end) AS jt
FROM   tbl 
GROUP  BY id
HAVING count(*) = count(value);

count() không tính giá trị NULL. Trong MySQL cũng có bit_and() .Xem thêm dưới câu hỏi liên quan này:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn MySQL - Bản ghi từ hôm nay đến 30 ngày trước

  2. JSON_VALID () - Kiểm tra JSON hợp lệ trong MySQL

  3. Khôi phục cơ sở dữ liệu mysql từ các tệp .frm

  4. Làm cách nào để tôi hoàn thành đường hầm SSH này từ bộ dock phát triển cục bộ đến cơ sở dữ liệu dàn dựng

  5. Làm cách nào để sử dụng điều kiện OR trong biểu thức MySQL CASE?