Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Entfernen von Duplikaten in der dynamischen ROW_NUMBER() OVER ORDER BY-Anweisung

Eine Möglichkeit wäre, den Spaltenalias auf einer anderen Ebene zu definieren, sodass Sie zweimal darauf verweisen können, ohne den Ausdruck zu wiederholen.

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) 

Ich würde jedoch in Betracht ziehen, stattdessen dynamisches SQL zu verwenden. Diese Art von Catch-All-Abfrage wird die Idee zerstören, einen guten Plan zu bekommen, der Indizes verwenden kann, um eine Sortierung zu vermeiden.