sql >> Databasteknik >  >> RDS >> Sqlserver

Tar bort dubblering i dynamisk ROW_NUMBER() OVER ORDER BY-sats

Ett sätt du kan göra detta är att definiera kolumnaliaset på en annan nivå så att du kan referera till det två gånger utan att upprepa uttrycket.

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) 

Jag skulle dock överväga att använda dynamisk SQL för detta istället. Den här typen av fånga alla-frågor kommer att döda tanken på att få en bra plan som kan använda index för att undvika en sortering.



  1. Skicka data från javascript till en mysql-databas

  2. Kör alla SQL-filer i en katalog

  3. Hur får man numeriska typer från MySQL med PDO?

  4. Köra ett Data Warehouse på PostgreSQL