В SQL Server, NULLIF()
израз проверява стойността на два посочени израза. Връща стойност null, ако са равни, в противен случай връща първия израз.
Синтаксис
Синтаксисът е така:
NULLIF ( expression , expression )
Пример
Ето пример за демонстрация:
SELECT NULLIF(3, 3);
Резултат:
NULL
Тук и двата израза са равни и резултатът е нулева стойност.
Ето какво се случва, когато изразите не са равни:
SELECT NULLIF(3, 7);
Резултат:
3
Този път се връща първата стойност.
Ето пример, който капсулира и двата резултата:
SELECT
NULLIF(0, 0) AS a,
NULLIF(3, 3) AS b,
NULLIF(3, 0) AS c,
NULLIF(0, 3) AS d;
Резултат:
+------+------+-----+-----+ | a | b | c | d | |------+------+-----+-----| | NULL | NULL | 3 | 0 | +------+------+-----+-----+
Практически пример
Да предположим, че имаме таблица със следните данни:
SELECT
ProductName,
ProductPrice
FROM Products;
Резултат:
+-------------------------------------+----------------+ | ProductName | ProductPrice | |-------------------------------------+----------------| | Left handed screwdriver | 25.99 | | Long Weight (blue) | 14.75 | | Long Weight (green) | 11.99 | | Smash 2000 Sledgehammer | 0.00 | | Chainsaw (includes 3 spare fingers) | 0.00 | | Straw Dog Box | NULL | | Bottomless Coffee Mugs (4 Pack) | 9.99 | | Right handed screwdriver | 25.99 | +-------------------------------------+----------------+ (8 rows affected)
И да предположим, че искаме да разберем колко продукта имат положителна цена. С други думи, не искаме да включваме продукти, които имат цена, нулева или нулева стойност.
За да направим това, можем да използваме NULLIF()
във връзка с COUNT()
функция:
SELECT
COUNT(NULLIF(ProductPrice, 0.00)) AS Result
FROM Products;
Резултат:
+----------+ | Result | |----------| | 5 | +----------+ Warning: Null value is eliminated by an aggregate or other SET operation.
Получаваме 5, както се очаква, което е точно колко реда имат положителна стойност в ProductPrice
колона.
Това работи, защото COUNT()
функцията отчита само ненулеви стойности. Като преобразуваме нулевите суми в нула, можем да игнорираме тези стойности в нашето изчисление.
Ето го отново без NULLIF()
функция.
SELECT COUNT(ProductPrice) AS Result
FROM Products;
Резултат:
+----------+ | Result | |----------| | 7 | +----------+ Warning: Null value is eliminated by an aggregate or other SET operation.
Този път включва нулевите суми и получаваме 7. Той все още игнорира ред 6, защото той всъщност има нулева стойност.
Когато първият аргумент е нулевата константа
Функцията не приема нулевата константа като първи аргумент:
SELECT NULLIF(null, 3);
Резултат:
Msg 4151, Level 16, State 1, Line 1 The type of the first argument to NULLIF cannot be the NULL constant because the type of the first argument has to be known.
Както се казва в съобщението за грешка, типът на първия аргумент трябва да е известен. Връщаната стойност на функцията използва типа данни на първия израз и тази грешка отразява това.
Тази грешка трябва да е доста рядка. В повечето случаи ще предавате име на колона като първи аргумент, а в SQL Server колоните имат дефиниран тип данни. В такива случаи действително ще бъде приета нулева стойност, поради факта, че SQL Server знае типа данни на колоната.
Същото може да се каже и за променливите. Ако предадете променлива, ще трябва да декларирате нейния тип и следователно няма да получите грешката.
Невалиден брой аргументи
Извикването на функцията без предаване на аргументи води до грешка:
SELECT NULLIF();
Резултат:
Msg 102, Level 15, State 1, Line 1 Incorrect syntax near ')'.
И предаването на твърде много аргументи също води до грешка:
SELECT NULLIF(1, 2, 3);
Резултат:
Msg 102, Level 15, State 1, Line 1 Incorrect syntax near ','.