Замінити нульові значення за замовчуванням, повернуті з лівого зовнішнього приєднання


97

У мене є запит Microsoft SQL Server 2008, який повертає дані з трьох таблиць за допомогою лівого зовнішнього об’єднання. Багато разів у другій та третій таблицях немає даних, і тому я отримую нуль, який, на мою думку, є типовим для лівого зовнішнього об’єднання. Чи є спосіб замінити значення за замовчуванням у операторі select? У мене є обхідний шлях, який я можу вибрати для змінної таблиці, але вона відчуває себе трохи брудною.

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-сервера, внаслідок чого ця відповідь відображатиметься на сторінках результатів пошуку і для цих інших контекстів.
dreftymac

Відповіді:


136

Це так просто

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

1
Для SQLite це буде IFNULL.
Chintan Shah

11

У випадку 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'

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.