Saya mempunyai prosedur tersimpan yang perlu mengembalikan jadual selepas menapis baris berdasarkan input. Dua daripada input ialah sort_column
和 sort_dir
。查询必须在 sort_dir
方向(ASC 或 DESC)中 ORDER BY sort_column
.
Saya mencuba pertanyaan berikut tidak berjaya. Pertanyaan di bawah telah dipermudahkan untuk memasukkan hanya istilah yang berkaitan. Penapis lain berfungsi dengan baik tanpa sebarang masalah.
SELECT * FROM 表 ORDER BY sort_column sort_dir
PILIH * DARI URUSAN jadual MENGIKUT KES sort_column
apabila 'col1' kemudian col1_name
APABILA 'col2' MAKA col2_name TAMAT
CASE sort_dir APABILA 'asc' MAKA ASC
LAIN DESC TAMAT
Saya menyambungkan 2 input kepada 1 input dalam format _ dan mencuba yang berikut:
SELECT * FROM table ORDER BY CASE sort_input WHEN 'col1_asc' THEN col1_name ASC WHEN 'col1_desc' THEN col1_name DESC WHEN 'col2_asc' THEN col2_name ASC WHEN 'col2_desc' THEN col2_name DESC END
Saya terus mendapat ralat #1064. Ia berbeza dalam setiap kes di atas, tetapi sentiasa menunjuk ke bahagian "KES". Ini adalah ralat dengan pilihan 2 yang dinyatakan di atas
##1064 - Terdapat ralat dalam sintaks SQL anda semak manual untuk versi pelayan MySQL anda untuk 'WHEN 'col1' THEN col1_name END CASE 'asc' BILA 'desc' THEN DESC ELSE pada baris 4 Betulkan sintaks untuk digunakan sekitar '
Masalahnya nampaknya bukan penamaan lajur. Ini ialah arah pengisihan yang tidak berfungsi. Jika saya mencuba setiap pilihan di atas tanpa bahagian "ASC" dan "DESC", tiada masalah.
Adakah saya melakukan sesuatu yang salah di sini? Adakah terdapat cara yang lebih baik selain CASE?
Versi MySQL: 5.6
Cara terbaik ialah berbilang
案例
:Ini mungkin kelihatan panjang. Walau bagaimanapun, ingat bahagian
CASE
是返回单个值的表达式。因此,您不能将ASC
和DESC
作为THEN
.Juga penting ialah isu jenis data. Pengkompil SQL menentukan jenis tunggal ungkapan
CASE
. Ini boleh menyebabkan masalah yang tidak dijangka apabila lajur daripada jenis yang berbeza.Penyelesaian paling mudah ialah menggunakan berbilang
CASE
ungkapan.