Substituir os valores nulos padrão retornados da junção externa esquerda

97

Eu tenho uma consulta do Microsoft SQL Server 2008 que retorna dados de três tabelas usando uma junção externa esquerda. Muitas vezes, não há dados na segunda e na terceira tabelas e, portanto, obtenho um nulo que acho que é o padrão para a junção externa esquerda. Existe uma maneira de substituir os valores padrão na instrução select? Eu tenho uma solução em que posso selecionar uma variável de tabela, mas parece um pouco sujo.

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'

Gostaria que a Quantidade e o Preço Regular fossem zero, se possível.

Brett Bim
fonte
Nota: Algumas das respostas nesta postagem tratam de bancos de dados diferentes do MSFT sql-server, fazendo com que essa resposta apareça nas páginas de resultados de pesquisa para outros contextos também.
dreftymac de
Veja também: stackoverflow.com/questions/799375/…
dreftymac

Respostas:

136

É tão fácil quanto

IsNull(FieldName, 0)

Ou mais 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
fonte
4
Eu sabia que tinha que ser fácil, mas por algum motivo, não sabia como fazê-lo. Obrigado.
Brett Bim
44
Se for MySQL, IsNull deve ser substituído por 'IFNULL'. Obrigado.
Dhanushka de
17
No PostgreSQL, parece ser "COALESCE" . Para MySQL, a página do manual está aqui: "IFNULL" . Não tenho certeza sobre o padrão.
David Tonhofer
3
No DB2, a resposta parece ser 'alternar bancos de dados'.
rtf
1
Para SQLite, será IFNULL.
Chintan Shah
11

No caso de MySQLou SQLitea palavra-chave correta é IFNULL(não 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
fonte
5

MySQL

COALESCE(field, 'default')

Por exemplo:

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

Além disso, você pode usar várias colunas para verificar a sua NULLpor COALESCE função. Por exemplo:

mysql> SELECT COALESCE(NULL, 1, NULL);
        -> 1
mysql> SELECT COALESCE(0, 1, NULL);
        -> 0
mysql> SELECT COALESCE(NULL, NULL, NULL);
        -> NULL
Amir Fo
fonte