2010-10-22 31 views
104

En MySQL, ¿hay alguna manera de establecer los campos "totales" en cero si son Nulos?Devuelve 0 si el campo es nulo en MySQL

Aquí es lo que tengo:

SELECT uo.order_id, uo.order_total, uo.order_status, 
      (SELECT SUM(uop.price * uop.qty) 
      FROM uc_order_products uop 
      WHERE uo.order_id = uop.order_id 
      ) AS products_subtotal, 
      (SELECT SUM(upr.amount) 
      FROM uc_payment_receipts upr 
      WHERE uo.order_id = upr.order_id 
      ) AS payment_received, 
      (SELECT SUM(uoli.amount) 
      FROM uc_order_line_items uoli 
      WHERE uo.order_id = uoli.order_id 
      ) AS line_item_subtotal 
      FROM uc_orders uo 
      WHERE uo.order_status NOT IN ("future", "canceled") 
      AND uo.uid = 4172; 

Los datos sale bien, excepto los campos NULL deben ser 0.

¿Cómo puedo devolver 0 para NULL en MySQL?

Respuesta

213

Uso IFNULL:

IFNULL(expr1, 0) 

De la documentación:

Si expr1 no es NULL, IFNULL() devuelve expr1; de lo contrario, devuelve expr2. IFNULL() devuelve un valor numérico o de cadena, según el contexto en el que se utiliza.

+0

¿Sería IFNULL ((SELECT SUM (* uop.price uop.qty) DE DONDE uc_order_products UOP uo.order_id = uop.order_id) AS products_subtotal, 0)? – Kevin

+2

@Kevin: No, el alias va al final. –

+1

Gotcha. ¡Eso funciona! Gracias. – Kevin

20

Puede usar coalesce(column_name,0) en lugar de solo column_name. La función coalesce devuelve el primer valor no nulo en la lista.

Debo mencionar que las funciones por fila como esta suelen ser problemáticas para la escalabilidad. Si cree que su base de datos puede llegar a ser de un tamaño decente, a menudo es mejor usar columnas adicionales y desencadenadores para mover el costo desde select al insert/update.

Esto amortiza el costo suponiendo que su base de datos se lea con más frecuencia que la que se escribe (y la mayoría de ellos lo son).

+0

Esto ocurre una vez por semana para facturar a todos los clientes. Los datos se escriben toda la semana, luego en un momento determinado, se calculan y se facturan. Piense en ello como un servicio de suscripción. Puede realizar cambios durante el período de facturación y su actividad se cobra a intervalos apropiados. – Kevin

+0

Yo agregaría que en esta situación preferiría unirme porque es la misma sintaxis para MS y My SQLs, mientras que MS SQL es iSnull y MySQL es iFnull, si eso le importa a cualquiera. (MySQL ISNULL es una función diferente de ISNULL de MS SQL) –

3

Usted puede intentar algo como esto

IFNULL(NULLIF(X, ''), 0) 

Atributo X se supone que es vacía si es una cadena vacía, así que después de que se puede declarar como un cero en lugar de último valor. En otro caso, seguiría siendo su valor original.

De todos modos, solo para dar otra manera de hacerlo.

+0

Esto funcionó para mí en el medio de un SELECT vs IFNULL normal (var, 0) – ajankuv

2

Sí La función IFNULL estará trabajando para lograr el resultado deseado.

SELECT uo.order_id, uo.order_total, uo.order_status, 
     (SELECT IFNULL(SUM(uop.price * uop.qty),0) 
     FROM uc_order_products uop 
     WHERE uo.order_id = uop.order_id 
     ) AS products_subtotal, 
     (SELECT IFNULL(SUM(upr.amount),0) 
     FROM uc_payment_receipts upr 
     WHERE uo.order_id = upr.order_id 
     ) AS payment_received, 
     (SELECT IFNULL(SUM(uoli.amount),0) 
     FROM uc_order_line_items uoli 
     WHERE uo.order_id = uoli.order_id 
     ) AS line_item_subtotal 
     FROM uc_orders uo 
     WHERE uo.order_status NOT IN ("future", "canceled") 
     AND uo.uid = 4172; 
+0

Sugiero que agregue una muestra de código, y no solo un enlace. Los enlaces pueden quedar obsoletos o cambiar. –

+0

Gracias Mister positivo. –

+0

Tengo la actualización de mi respuesta y la agregué con todos los detalles. –

Cuestiones relacionadas