Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Премахване на дублиране в динамичен оператор ROW_NUMBER() OVER ORDER BY

Един от начините да направите това е да дефинирате псевдонима на колоната на различно ниво, така че да можете да го препратите два пъти, без да повтаряте израза.

SELECT *,
       Row_number() OVER (ORDER BY 
                 CASE WHEN @SortBy LIKE '% ASC' THEN sort_col END ASC, 
                 CASE WHEN @SortBy LIKE '% DESC' THEN sort_col END DESC) AS RowNumber
FROM   YourTable
       CROSS APPLY (SELECT CASE
                             WHEN @SortBy LIKE 'column1 %' THEN Cast(column1 AS SQL_VARIANT)
                             WHEN @SortBy LIKE 'column2 %' THEN Cast(column2 AS SQL_VARIANT)
                             WHEN @SortBy LIKE 'column3 %' THEN Cast(column3 AS SQL_VARIANT)
                             WHEN @SortBy LIKE 'column4 %' THEN Cast(column4 AS SQL_VARIANT)
                           END) C(sort_col) 

Все пак бих обмислил използването на динамичен SQL за това. Този вид запитване за улавяне на всички ще убие идеята за получаване на добър план, който може да използва индекси, за да избегне сортиране.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Логически проблем на SQL и заявка за кръстосано прилагане

  2. Промяна на таблица и добавяне на УНИКАЛЕН ключ води до грешка

  3. SQL QUERY, показващ Между датите като конкретни дати + Данни, принадлежащи към всяка дата!

  4. Въздействие на разширеното събитие query_post_execution_showplan в SQL Server 2012

  5. Връщане на данни преди текущия месец