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

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

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'

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

 dreftymac16 мая 2019 г., 21:25
Замечания: Некоторые ответы в этом посте имеют дело с базами данных, отличными от MSFT sql-server, поэтому этот ответ будет отображаться на страницах результатов поиска и в других контекстах.
 dreftymac16 мая 2019 г., 21:26
Смотрите также: stackoverflow.com/questions/799375/...

Ответы на вопрос(3)

MySQL
COALESCE(field, 'default')

Например:

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

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

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

Тот'так же просто, как

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'
 AltF4_01 сент. 2017 г., 14:20
Золотой ответ .... спас мне массу неприятностей
 Tanner Faulkner06 мая 2017 г., 00:21
В DB2 ответ выглядит так:переключать базы данных ».
 Dhanushka14 июл. 2014 г., 08:54
Если это MySQL, IsNull следует заменить на 'IFNULL», Благодарю.
 Chintan Shah06 сент. 2017 г., 07:52
Для SQLite это будет.IFNULL
 David Tonhofer14 июл. 2014 г., 18:43
В PostgreSQL, похоже,COALESCE», Для MySQL страница руководства находится здесь: "IFNULL», Не уверен насчет стандарта.
 Brett Bim02 нояб. 2009 г., 23:59
Я знал, что это должно быть легко, но по какой-то причине меня заблокировали, как это сделать. Благодарю.

Ваш ответ на вопрос