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.


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

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'

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'

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.