2013-04-12 5 views
0

Я создаю sprocs с некоторыми вычислениями, и я хочу убедиться, что я не пропущу что-то простое.Как по умолчанию NULL to Zero

Скажем, я нахожу SUM() столбца, у которого могут быть NULL. Есть ли один оператор набора, который автоматически преобразует NULL в Zero без необходимости COALESCE каждый раз? Или мне нужно вручную проверять NULL каждый раз?

Я просмотрел MSDN SET, но я не вижу ничего полезного.

Есть способ сделать NULL работу с конкатенацией, но я ничего не вижу для расчетов.

Например:

SET ANSI_NULLS ON 
SET CONCAT_NULL_YIELDS_NULL ON 

--Calc 
SELECT SUM(CONVERT(decimal(10,2), NULL)) 
SELECT SUM(CONVERT(decimal(10,2), Coalesce(NULL,0))) 

--Concat 
SELECT NULL + ', ' + 'Isaak' AS Name 
SELECT COALESCE(NULL + ', ' + 'Isaak','') AS Name 
SELECT COALESCE(NULL,'') + ', ' + 'Isaak' AS Name 

--Change Concat NULL to OFF 
SET ANSI_NULLS ON 
SET CONCAT_NULL_YIELDS_NULL OFF 

--Calc 
SELECT SUM(CONVERT(decimal(10,2), NULL)) 
SELECT SUM(CONVERT(decimal(10,2), Coalesce(NULL,0))) 

--Concat 
SELECT NULL + ', ' + 'Isaak' AS Name 
SELECT COALESCE(NULL + ', ' + 'Isaak','') AS Name 
SELECT COALESCE(NULL,'') + ', ' + 'Isaak' AS Name 
+1

@JeremyHolovacs - Не когда 'CONCAT_NULL_YIELDS_NULL'' 'OFF'. Это устаревший вариант, и для добавления нет эквивалента. –

+1

@JeremyHolovacs нет, не будет. Это именно то, что «SET CONCAT_NULL_YIELDS_NULL OFF» будет делать. –

+1

На самом деле 'SUM' уже работает точно так же, как и конкатенация с этой опцией. 'SELECT CAST (NULL AS VARCHAR) + CAST (NULL AS VARCHAR)' все еще возвращает 'NULL'. Единственный способ вернуть «NULL» - это если все входы были «NULL» –

ответ

2

Нет, нет никакой магии способ сделать это. Однако существует несколько обходных путей:

  1. Stop позволяет NULL с в первую очередь - добавить по умолчанию 0, и если вы не можете обновить логику DML затем добавить триггер (но гораздо предпочтительнее, чтобы сделать это как часть оригинальная вставка/обновление).
  2. Поместите COALESCE в представление, а затем укажите представление в ваших запросах.
  3. Сохраняйте нуль (используя, конечно, COALESCE) в отдельный, вычисленный столбец и меняйте расчет, чтобы использовать вычисленный столбец вместо исходного столбца.
+0

Так что я должен держаться подальше от 'SET CONCAT_NULL_YIELDS_NULL OFF'? – MisterIsaak

+1

@JIsaak - Да. См. [Предупреждение здесь] (http://msdn.microsoft.com/en-gb/library/ms176056.aspx) –

+0

И 'SELECT SUM (CONVERT (десятичный (10,2), Coalesce (NULL, 0))) 'вполне приемлемо? – MisterIsaak

 Смежные вопросы

  • Нет связанных вопросов^_^