2010-03-31 20 views
5

Đối với truy vấn nàymysql phút lờ null - cần workaround/tinh chỉnh

SELECT min(date) min_date FROM order_products group by order_id 

min_date bỏ qua NULL giá trị trong một nhóm các id trật tự.

Trong trường hợp của tôi, tôi muốn min_date = NULL nếu nhóm có một tuple order_products với giá trị null trong ngày.

Bất kỳ ý tưởng nào tôi có thể đạt được điều này?

Trả lời

9

một cách giải quyết đơn giản có thể là:

SELECT min(IFNULL(date, '1970-01-01')) AS min_date 
FROM order_products 
GROUP BY order_id 

Vì vậy, nếu 1970/01/01 lần lượt lên, bạn biết rằng có một giá trị NULL.

+0

truy vấn này trả về tất cả các giá trị min_date là '1970-01-01'. Bạn có chắc chắn rằng một trong những công trình này, có u đã thử nó trước? – shikhar

+1

@shikhar: Không, tôi đã không thử nó trước đây, nhưng tôi đã thử nó ngay bây giờ và nó làm việc cho tôi. Có lẽ có NULL trong tất cả các đơn đặt hàng? – Bobby

+0

hey cảm ơn .. tôi thực sự đã có tất cả các NULL .. nó đã làm việc – shikhar

0

Một trong những cách để làm điều đó, nếu miền vấn đề của bạn cho phép xác định "ngày tối thiểu tuyệt đối", là sử dụng biểu thức ISNULL()/COALESCE() để biến trường không có giá trị thành không null.

ISNULL(dateField, '1000-01-01')

Một (f không có ý nghĩa mặc định "nhỏ" có thể được định nghĩa) là để làm điều đó thông qua 2 truy vấn - đầu tiên chọn thứ VỚI null, sau đó nếu đặt kết quả là trống rỗng, thêm vào những thứ mà ngày là không null

0
select case when count(date)=sum(1) then min(date) else null end 

hoặc, khi tất cả các hàng không rỗng, trả về ngày tối thiểu, trả về giá trị không.

1

Nếu câu hỏi là về việc tìm ngày tối thiểu từ nhiều cột thì những điều sau đây có thể hữu ích;

SELECT 
     LEAST 
      (IFNULL(date_1, date(CURRENT_DATE()+1)), 
      IFNULL(date_2, date(CURRENT_DATE()+1)), 
      IFNULL(date_3, date(CURRENT_DATE()+1))) as MinimumDate 
FROM YourTable;