Динамическое направление заказа

Если вам нужно сохранить zipcode в zipcode символьного массива [], вы можете использовать это:

snprintf( zipcode, 6, "%05.5d", atoi(zipcode));
24
задан Vadim Ovchinnikov 11 May 2018 в 12:15
поделиться

3 ответа

У вас может быть два почти идентичных элемента ORDER BY , один ASC и один DESC , а также расширить свой ] CASE утверждение, чтобы одно или другое из них всегда равнялось одному значению:

ORDER BY
      CASE WHEN @OrderDirection = 0 THEN 1
      ELSE
           CASE WHEN @OrderByColumn = 'AddedDate' THEN CONVERT(varchar(50), AddedDate)
                WHEN @OrderByColumn = 'Visible' THEN CONVERT(varchar(2), Visible)
                WHEN @OrderByColumn = 'AddedBy' THEN AddedBy
                WHEN @OrderByColumn = 'Title' THEN Title
           END
      END ASC,
      CASE WHEN @OrderDirection = 1 THEN 1
      ELSE
           CASE WHEN @OrderByColumn = 'AddedDate' THEN CONVERT(varchar(50), AddedDate)
                WHEN @OrderByColumn = 'Visible' THEN CONVERT(varchar(2), Visible)
                WHEN @OrderByColumn = 'AddedBy' THEN AddedBy           
                WHEN @OrderByColumn = 'Title' THEN Title
           END
      END DESC
31
ответ дан 28 November 2019 в 23:13
поделиться

Вот пример:

CREATE PROCEDURE GetProducts 
( 
    @OrderBy      VARCHAR(50), 
    @Input2       VARCHAR(30) 
) 
AS 
BEGIN 
    SET NOCOUNT ON 

    SELECT Id, ProductName, Description, Price, Quantity 
    FROM Products 
    WHERE ProductName LIKE @Input2 
    ORDER BY 
        CASE             
            WHEN @OrderBy = 'ProductNameAsc' THEN ProductName 
        END ASC, 
        CASE 
            WHEN @OrderBy = 'ProductNameDesc' THEN ProductName 
        END DESC 

END

Отсюда:

http://www.dominicpettifer.co.uk/Blog/21/dynamic-conditional-order-by-clause- in-sql-server-t-sql

Действия по возрастанию и убыванию необходимы быть сгруппированным в отдельный CASE операторы, разделенные запятой. В ваш серверный код / ​​скрипт убедитесь, что добавить "Asc" или "Desc" к заказ по строке, или у вас может быть два Входные параметры хранимой процедуры для имя столбца и порядок по направлению, если вы хотите.

4
ответ дан 28 November 2019 в 23:13
поделиться

Вы можете упростить CASE, используя ROW_NUMBER, который сортирует ваши данные и эффективно преобразует их в удобный целочисленный формат. Тем более что вопрос помечен как SQL Server 2005

. Он также достаточно легко расширяется, чтобы иметь дело с вторичными и третичными сортировками

. Я использовал множитель, чтобы снова упростить фактический оператор выбора и уменьшить вероятность оценки RBAR в ORDER BY

DECLARE @multiplier int;

SELECT @multiplier = CASE @Direction WHEN 1 THEN -1 ELSE 1 END;

SELECT
     Columns you actually want
FROM
    (
    SELECT
         Columns you actually want,
         ROW_NUMBER() OVER (ORDER BY AddedDate) AS AddedDateSort,
         ROW_NUMBER() OVER (ORDER BY Visible) AS VisibleSort,
         ROW_NUMBER() OVER (ORDER BY AddedBy) AS AddedBySort,
         ROW_NUMBER() OVER (ORDER BY Title) AS TitleSort
    FROM
         myTable
    WHERE
         MyFilters...
    ) foo
ORDER BY
     CASE @OrderByColumn
        WHEN 'AddedDate' THEN AddedDateSort
        WHEN 'Visible' THEN VisibleSort    
        WHEN 'AddedBy' THEN AddedBySort
        WHEN 'Title' THEN TitleSort
     END * @multiplier;
12
ответ дан 28 November 2019 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: