2010-03-31 8 views
5

Per questa querymysql min ignora null - necessità soluzione/tweak

SELECT min(date) min_date FROM order_products group by order_id 

min_date ignora i valori NULL in un gruppo di ordine id.

Nel mio caso desidero min_date = NULL se il gruppo ha una tupla order_products con valore null in data.

Qualche idea come posso ottenere questo?

risposta

9

una soluzione semplice potrebbe essere:

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

Quindi, se 1970/01/01 gira in su, si sa che c'è un valore NULL.

+0

questa query restituisce tutti i valori min_date come "1970-01-01". Sei sicuro che questo funziona, ci hai provato prima? – shikhar

+1

@shikhar: No, non l'ho provato prima, ma l'ho provato ora e funziona per me. Forse ci sono valori NULL in tutti gli ordini? – Bobby

+0

hey grazie .. ho davvero avuto tutti i NULL .. ha funzionato – shikhar

0

Uno dei modi per farlo, se il dominio del problema consente di definire una "data minima assoluta", è utilizzare l'espressione ISNULL()/COALESCE() per trasformare un campo nullable in non null.

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

Altro (f senza significativa default "più piccolo" può essere definito) è di farlo tramite 2 domande - prima roba di selezione con i NULL, quindi se il set di risultati è vuoto, aggiungere in cose in cui data è non nullo

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

oppure, quando tutte le righe non sono nulle, restituiscono la data minima, altrimenti restituiscono null.

1

Se la domanda riguarda la ricerca della data minima da più colonne, il seguente potrebbe aiutare;

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;