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.

Brett Bim
fuente
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
Ver también: stackoverflow.com/questions/799375/…
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'
Michael Haren
fuente
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'
Zendem
fuente
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
Amir Fo
fuente