Подтвердить что ты не робот

Использование переменных для asc и desc в порядке

Я понимаю, что я могу использовать переменные в порядке по разделам sql-запросов, например:

order by 
case when @var1 = 'priority' then priority end desc,
case when @var2 = 'report_date' then report_date end asc

Но как я могу использовать переменные для секций asc и desc?

4b9b3361

Ответ 1

без Dynamic SQL каждая опция, например, это:

ORDER BY
  case when @var1 = 'priority asc' THEN priority END ASC ,
  case when @var1 = 'priority desc' then priority end DESC,
  case when @var2 = 'report_date asc' then report_date end ASC,
  case when @var2 = 'report_date desc' then report_date end DESC

Ответ 2

Вы можете сортировать динамически по многим типам, введя взлома множителя в Order by. Реализация будет зависеть от того, как вы сможете преобразовать каждое отсортированное поле в целое поле, например:

DECLARE @Var1 NVARCHAR(20);
DECLARE @Var2 NVARCHAR(3);
DECLARE @OrderHack INT;

SET @Var1 = 'priority';
SET @Var2 = 'DESC';

IF (@Var2 = 'ASC')
    SET @OrderHack = 1;
ELSE
    SET @OrderHack = -1;

SELECT * 
    FROM SortTable
    ORDER BY 
        CASE @var1
            WHEN 'priority'
                THEN CONVERT(INT, [priority]) * @OrderHack
            WHEN 'report_date'
                THEN CONVERT(INT, report_date) * @OrderHack
        END;

SqlFiddle здесь

Edit

Просто, чтобы уточнить, в соответствии с точкой @t-clausen.dk, взломация зависит от преобразования обратно к возрастающему числовому типу, представляющему порядок. например если вам требуется более высокое разрешение на DATETIME, чтобы гарантировать, что компонент времени также учитывается в сортировке, INT @OrderHack можно заменить на FLOAT или DECIMAL и т.д. Предостережение: использование этого метода для сортировки по *CHAR могут быть сложными, особенно если учитывать чувствительность к случаю и акценту.

Ответ 3

Предполагая, что ваша переменная @var3 хранит ключевые слова 'ASC' или 'DESC', вы можете написать примерно следующее:

order by 
case when @var1 = 'priority' and @var3 = 'DESC' then priority end DESC,
case when @var1 = 'priority' and @var3 = 'ASC' then priority  end ASC,
case when @var2 = 'report_date' and @var3 = 'ASC' then report_date end ASC,
case when @var2 = 'report_date' and @var3 = 'DESC' then report_date end DESC

Ответ 4

Попробуйте этот вариант -

DECLARE 
      @column VARCHAR(15) = 'object_id'
    , @order CHAR(4) = 'DESC'

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = '
SELECT * 
FROM sys.objects 
ORDER BY ' + @column + ' ' + @order

PRINT @SQL
EXEC sys.sp_executesql @SQL