Reemplazar valores nulos predeterminados devueltos desde la unión externa izquierda


97

Tengo una consulta de Microsoft SQL Server 2008 que devuelve datos de tres tablas usando una combinación externa izquierda. Muchas veces, no hay datos en la segunda y tercera tablas, por lo que obtengo un valor nulo que creo que es el predeterminado para la combinación externa izquierda. ¿Hay alguna forma de reemplazar los valores predeterminados en la instrucción de selección? Tengo una solución alternativa en la que puedo seleccionar una variable de tabla, pero se siente un poco sucio.

SELECT iar.Description, iai.Quantity, iai.Quantity * rpl.RegularPrice as 'Retail', 
iar.Compliance FROM InventoryAdjustmentReason iar
LEFT OUTER JOIN InventoryAdjustmentItem iai  on (iar.Id = iai.InventoryAdjustmentReasonId)
LEFT OUTER JOIN Item i on (i.Id = iai.ItemId)
LEFT OUTER JOIN ReportPriceLookup rpl on (rpl.SkuNumber = i.SkuNo)
WHERE iar.StoreUse = 'yes'

Me gustaría que la cantidad y el precio regular se establezcan por defecto en cero si es posible.


Nota: Algunas de las respuestas en esta publicación tratan con bases de datos que no sean MSFT sql-server, lo que hace que esta respuesta también aparezca en las páginas de resultados de búsqueda para esos otros contextos.
dreftymac

Respuestas:


136

Eso es tan fácil como

IsNull(FieldName, 0)

O más completamente:

SELECT iar.Description, 
  ISNULL(iai.Quantity,0) as Quantity, 
  ISNULL(iai.Quantity * rpl.RegularPrice,0) as 'Retail', 
  iar.Compliance 
FROM InventoryAdjustmentReason iar
LEFT OUTER JOIN InventoryAdjustmentItem iai  on (iar.Id = iai.InventoryAdjustmentReasonId)
LEFT OUTER JOIN Item i on (i.Id = iai.ItemId)
LEFT OUTER JOIN ReportPriceLookup rpl on (rpl.SkuNumber = i.SkuNo)
WHERE iar.StoreUse = 'yes'

4
Sabía que tenía que ser fácil, pero por alguna razón, estaba bloqueado sobre cómo hacerlo. Gracias.
Brett Bim

44
Si es MySQL, IsNull debe reemplazarse con 'IFNULL'. Gracias.
Dhanushka

17
En PostgreSQL, parece ser "COALESCE" . Para MySQL, la página del manual está aquí: "IFNULL" . No estoy seguro del estándar.
David Tonhofer

3
En DB2, la respuesta parece ser 'cambiar bases de datos'.
rtf

1
Para SQLite, lo será IFNULL.
Chintan Shah

11

En caso de MySQLo SQLitela palabra clave correcta es IFNULL(no ISNULL).

 SELECT iar.Description, 
      IFNULL(iai.Quantity,0) as Quantity, 
      IFNULL(iai.Quantity * rpl.RegularPrice,0) as 'Retail', 
      iar.Compliance 
    FROM InventoryAdjustmentReason iar
    LEFT OUTER JOIN InventoryAdjustmentItem iai  on (iar.Id = iai.InventoryAdjustmentReasonId)
    LEFT OUTER JOIN Item i on (i.Id = iai.ItemId)
    LEFT OUTER JOIN ReportPriceLookup rpl on (rpl.SkuNumber = i.SkuNo)
WHERE iar.StoreUse = 'yes'

5

MySQL

COALESCE(field, 'default')

Por ejemplo:

  SELECT
    t.id,
    COALESCE(d.field, 'default')
  FROM
     test t
  LEFT JOIN
     detail d ON t.id = d.item

Además, puede utilizar varias columnas para comprobar su NULLpor COALESCE función. Por ejemplo:

mysql> SELECT COALESCE(NULL, 1, NULL);
        -> 1
mysql> SELECT COALESCE(0, 1, NULL);
        -> 0
mysql> SELECT COALESCE(NULL, NULL, NULL);
        -> NULL
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.