есть ли разница в следующих запросах сортировки - PullRequest
1 голос
/ 30 мая 2019
DECLARE @Table1 TABLE (ID INT IDENTITY(1,1), Field1 INT, FieldSomethingElse VARCHAR(10))

INSERT INTO @Table1 (Field1, FieldSomethingElse) VALUES (1, 'b')
INSERT INTO @Table1 (Field1, FieldSomethingElse) VALUES (2, null)
INSERT INTO @Table1 (Field1, FieldSomethingElse) VALUES (765, 'a')
INSERT INTO @Table1 (Field1, FieldSomethingElse) VALUES (NULL, 'd')
INSERT INTO @Table1 (Field1, FieldSomethingElse) VALUES (NULL, 'f')
INSERT INTO @Table1 (Field1, FieldSomethingElse) VALUES (76, null)
INSERT INTO @Table1 (Field1, FieldSomethingElse) VALUES (3, 'r')
INSERT INTO @Table1 (Field1, FieldSomethingElse) VALUES (40, 'b')

declare @flag bit = 0;

SELECT *
FROM @Table1
ORDER BY
  case when @flag = 1 then  ISNULL(Field1,0) else 0 end  desc , ID  desc

SELECT *
FROM @Table1
ORDER BY
  case when @flag = 1 then ISNULL(Field1,0) end desc, ID desc

Есть ли разница, если я напишу

 1. case when @flag = 1 then ISNULL(Field1,0) else 0 end desc, ID desc

или

 2. case when @flag = 1 then ISNULL(Field1,0) end desc, ID desc

Мне посоветовали использовать вариант 1, но для меня оба варианта одинаковы, потому что я вижутот же результат.Есть ли разница?

как параметры 1 и 2 влияют на сортировку?

Ответы [ 2 ]

2 голосов
/ 30 мая 2019

Для первого предложения:

1. case when @flag = 1 then  ISNULL(Field1,0) else 0 end  desc , ID  desc

Если @flag не равен 1, тогда вы получите 0. Для второго:

2. case when @flag = 1 then ISNULL(Field1,0) end desc, ID desc

Если @flag не равен 1, тогда будет возвращено null.

Так как он в вашем order by, нет никакой разницы в функциональности.

0 голосов
/ 30 мая 2019

Я думаю, есть небольшая разница.Когда флаг = 0, следующие выражения одинаковы

order by case when @flag = 1 then ISNULL(Field1,0) end desc, ID desc

и

order by case when @flag = 1 then ISNULL(Field1,0) else null end desc, ID desc

давайте предположим, что вместо Field1 и Id мы сортируем двухбитные столбцы .В этом случае при сортировке двух столбцов будет учитываться NULL.

https://rextester.com/SBDJQ20053

, поэтому рекомендуется использовать

case when @flag = 1 then ISNULL(Field1,0) else 0 end desc, ID desc

, чтобы избежать нуля при сортировке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...