Параметризовать 'order by' в SQL - PullRequest
       9

Параметризовать 'order by' в SQL

4 голосов
/ 01 августа 2009

Какой правильный способ параметризации заказа по предложению в ADO.NET?

Иногда необходимо упорядочить по 2 столбцам, в то время как по умолчанию используется порядок только по 1 столбцу, а иногда вам просто нужно изменить ASC на DEC. Считается ли нормальным просто использовать конкатенацию строк в таких случаях (при условии, что входные данные поступают не от пользователя напрямую, а просто для поиска более или менее жестко закодированных значений в коде)

Ответы [ 6 ]

4 голосов
/ 01 августа 2009

Попробуй так:

SELECT ...
ORDER BY 
   CASE WHEN @OrderBy = 'Option1' THEN SomeField END, 
   CASE WHEN @OrderBy = 'Option1' THEN SomeOtherField END DESC, 
   CASE WHEN @OrderBy = 'Option2' THEN Field75 END, 
  ...

Идея состоит в том, что каждый оператор CASE будет иметь значение NULL, если WHEN не совпадает. Поэтому, если вы добавите Option2, вы получите постоянное значение для первых двух вариантов.

Таким образом, используя это, вы можете легко иметь некоторые опции, которые позволяют сортировать по нескольким полям, или по убыванию, или по желанию.

Rob

2 голосов
/ 01 августа 2009

Пуристы SQL Injection скажут вам, что конкатенация строк никогда не допустима, потому что всегда существует вероятность того, что другой программист может расширить программу и представить оператор SQL внешнему миру.

Однако, если значения жестко закодированы (то есть как константа) и никогда не увидят внешний мир, то да, это нормально, что их можно объединить.

0 голосов
/ 20 октября 2015

Пример:

SELECT 1 AS Num, '2015-06-22' AS Datex INTO Arya
INSERT INTO Arya 
SELECT 2, '2015-08-17' UNION SELECT 3, '2015-07-14'

Таблица Арья:

Num   Datex
----------------- 
1, 2015-06-22
2, 2015-08-17
3, 2015-07-14

Теперь, Параметризация сортировки (на основе поля Datex) в ВЫБОР .... .... 1007 *

SELECT Num, Date1 FROM ARYA, (SELECT -1 as e union Select 1 as e) a
WHERE a.e=1  --(1) For ASC sort --(OR a.e=-1) For Desc Sort
ORDER BY DATEDIFF(DAY, '2000-01-01', Arya.Datex)*a.e


Result: ASC Sort IF 1
1, 2015-06-22
3, 2015-07-14
2, 2015-08-17

Result: ASC Sort IF -1
2, 2015-08-17
3, 2015-07-14
1, 2015-06-22
0 голосов
/ 01 августа 2009

Если бы не так много данных, я бы просто получил:

DataTable dt = ....
DataView dv = new DataView(dt);
dv.Sort = "LastName DESC, FistName";

, а затем измените последнюю строку на основе чего угодно.

0 голосов
/ 01 августа 2009

Существуют чистые решения T-SQL, которые не используют динамический SQL.

  • До SQL 2005 вы должны были использовать CASE в ORDER BY
  • После SQL 2005 вы можете использовать ROW_NUMBER и т. Д.

Некоторые ответы здесь: Направление динамического ордера . Принятый ответ и мой ответ демонстрируют 2 подхода. Возможно, это специфично для SQL Server.

0 голосов
/ 01 августа 2009

Пока пользователь не может вводить текст или может получить доступ к переменной через URL, я не вижу никаких негативных причин в использовании конкатенации строк. Если только парень не говорит, что программа может быть расширена другим пользователем, который не настолько «сознателен для инъекций».

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