Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Urutan Bersyarat T-SQL Oleh

CASE adalah ekspresi yang mengembalikan nilai. Ini bukan untuk kontrol aliran, seperti IF . Dan Anda tidak dapat menggunakan IF dalam kueri.

Sayangnya, ada beberapa batasan dengan CASE ekspresi yang membuatnya rumit untuk melakukan apa yang Anda inginkan. Misalnya, semua cabang dalam CASE ekspresi harus mengembalikan tipe yang sama, atau secara implisit dapat dikonversi ke tipe yang sama. Saya tidak akan mencobanya dengan string dan tanggal. Anda juga tidak dapat menggunakan CASE untuk menentukan arah pengurutan.

SELECT column_list_please
FROM dbo.Product -- dbo prefix please
ORDER BY 
  CASE WHEN @sortDir = 'asc' AND @sortOrder = 'name' THEN name END,
  CASE WHEN @sortDir = 'asc' AND @sortOrder = 'created_date' THEN created_date END,
  CASE WHEN @sortDir = 'desc' AND @sortOrder = 'name' THEN name END DESC,
  CASE WHEN @sortDir = 'desc' AND @sortOrder = 'created_date' THEN created_date END DESC;

Solusi yang bisa dibilang lebih mudah (terutama jika ini menjadi lebih kompleks) adalah dengan menggunakan SQL dinamis. Untuk menggagalkan injeksi SQL, Anda dapat menguji nilainya:

IF @sortDir NOT IN ('asc', 'desc')
  OR @sortOrder NOT IN ('name', 'created_date')
BEGIN
  RAISERROR('Invalid params', 11, 1);
  RETURN;
END

DECLARE @sql NVARCHAR(MAX) = N'SELECT column_list_please
  FROM dbo.Product ORDER BY ' + @sortOrder + ' ' + @sortDir;

EXEC sp_executesql @sql;

Kelebihan lain untuk SQL dinamis, terlepas dari semua ketakutan yang tersebar tentangnya:Anda bisa mendapatkan paket terbaik untuk setiap variasi jenis, alih-alih satu paket tunggal yang akan mengoptimalkan variasi jenis apa pun yang Anda gunakan terlebih dahulu. Ini juga berkinerja paling baik secara universal dalam perbandingan kinerja baru-baru ini yang saya jalankan:

http://sqlperformance.com/conditional-order-by



  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 - Bagaimana cara menyimpan dan menavigasi hierarki?

  2. Apa pro dan kontra untuk menjaga SQL di Stored Procs versus Code

  3. Batasan unik SQL di beberapa tabel

  4. Tetapkan Pasangan Kunci/Nilai dalam Konteks Sesi di SQL Server (sp_set_session_context)

  5. sp_add_schedule vs sp_add_jobschedule di SQL Server:Apa Bedanya?