ISNULL(col2,'c') = ISNULL(@value2,ISNULL(col2,'c'))
- это то же самое, что и
( ( col2 = @value2 ) OR ( @value2 IS NULL ) )
Я не уверен, что это улучшит производительность, хотя: я читал это, по крайней мере для SQL Server 2005 и более ранних версий, чтобы получить эффективное, масштабируемое и производительное решение, либо используйте IF ELSE
управление блоками потока (по одному на комбинацию параметров), либо используйте динамический SQL .
UPDATE: ... и вот доказательство:
Запрос 1: когда параметр является значением, отличным от нуля:
DECLARE @value2 VARCHAR(10);
SET @value2 = 'Apples';
WITH T
AS
(
SELECT *
FROM (
VALUES (1, 'When col2 is null', NULL),
(2, 'When col2 is the same value as @value2', 'Apples'),
(3, 'When col2 is not the same value as @value2', 'Oranges')
) AS T (ID, narrative, col2)
)
SELECT *,
CASE WHEN ISNULL(col2,'c') = ISNULL(@value2,ISNULL(col2,'c')) THEN 'T' END AS OP,
CASE WHEN ( ( col2 = @value2 ) OR ( @value2 IS NULL ) ) THEN 'T' END AS OneDayWhen,
CASE WHEN col2 = @value2 or (col2 is null and @value2 is null) THEN 'T' END AS Adrian
FROM T;
Выход 1:
ID narrative col2 OP OneDayWhen Adrian
----------- ------------------------------------------ ------- ---- ---------- ------
1 When col2 is null NULL NULL NULL NULL
2 When col2 is the same value as @value2 Apples T T T
3 When col2 is not the same value as @value2 Oranges NULL NULL NULL
Обратите внимание, что все согласны для всехlines:)
Запрос 2: Если параметр имеет значение NULL:
DECLARE @value2 VARCHAR(10);
SET @value2 = NULL;
WITH T
AS
(
SELECT *
FROM (
VALUES (1, 'When col2 is null', NULL),
(2, 'When col2 is the same value as @value2', 'Apples'),
(3, 'When col2 is not the same value as @value2', 'Oranges')
) AS T (ID, narrative, col2)
)
SELECT *,
CASE WHEN ISNULL(col2,'c') = ISNULL(@value2,ISNULL(col2,'c')) THEN 'T' END AS OP,
CASE WHEN ( ( col2 = @value2 ) OR ( @value2 IS NULL ) ) THEN 'T' END AS OneDayWhen,
CASE WHEN col2 = @value2 or (col2 is null and @value2 is null) THEN 'T' END AS Adrian
FROM T;
Выход 2:
ID narrative col2 OP OneDayWhen Adrian
----------- ------------------------------------------ ------- ---- ---------- ------
1 When col2 is null NULL T T T
2 When col2 is the same value as @value2 Apples T T NULL
3 When col2 is not the same value as @value2 Oranges T T NULL
Примечание OP и OneDayWhen совпадают для всехстрок, Адриан соответствует только идентификатору строки = 1.