Заменить нулевые значения по умолчанию, возвращенные из левого внешнего соединения

98

У меня есть запрос Microsoft SQL Server 2008, который возвращает данные из трех таблиц с использованием левого внешнего соединения. Часто во второй и третьей таблицах нет данных, поэтому я получаю значение null, которое, как мне кажется, является значением по умолчанию для левого внешнего соединения. Есть ли способ заменить значения по умолчанию в операторе выбора? У меня есть обходной путь: я могу выбрать переменную таблицы, но она кажется немного грязной.

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'

Я бы хотел, чтобы Quantity и RegularPrice по умолчанию были равны нулю, если это возможно.

Бретт Бим
источник
Примечание. Некоторые ответы в этом сообщении относятся к базам данных, отличным от MSFT sql-server, из-за чего этот ответ также отображается на страницах результатов поиска для этих других контекстов.
dreftymac
См. Также: stackoverflow.com/questions/799375/…
dreftymac

Ответы:

138

Это так просто, как

IsNull(FieldName, 0)

Или более полно:

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
Я знал, что это должно быть легко, но по какой-то причине я не знал, как это сделать. Спасибо.
Бретт Бим
44
Если это MySQL, IsNull следует заменить на IFNULL. Спасибо.
Dhanushka
17
В PostgreSQL это похоже на «COALESCE» . Для MySQL страница руководства находится здесь: «IFNULL» . Не уверен насчет стандарта.
Дэвид Тонхофер
3
В DB2 ответом кажется «переключение баз данных».
RTF
2
Для SQLite так и будет IFNULL.
Чинтан Шах
12

В случае MySQLили SQLiteправильное ключевое слово IFNULL(not 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')

Например:

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

Кроме того , вы можете использовать несколько столбцов , чтобы проверить их NULLна COALESCE функцию. Например:

mysql> SELECT COALESCE(NULL, 1, NULL);
        -> 1
mysql> SELECT COALESCE(0, 1, NULL);
        -> 0
mysql> SELECT COALESCE(NULL, NULL, NULL);
        -> NULL
Амир Фо
источник