Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Removendo a duplicação na instrução dinâmica ROW_NUMBER() OVER ORDER BY


Uma maneira de fazer isso seria definir o alias da coluna em um nível diferente para poder referenciá-lo duas vezes sem repetir a expressão.
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) 

Eu consideraria usar SQL dinâmico para isso. Esse tipo de consulta abrangente matará a ideia de obter um bom plano que possa usar índices para evitar uma classificação.