我有一個預存程序,它必須在根據輸入過濾行後傳回一個表。其中兩個輸入是 sort_column
和 sort_dir
。查詢必須在 sort_dir
方向(ASC 或 DESC)中 ORDER BY sort_column
。
我嘗試了以下查詢,但沒有成功。以下的查詢已被簡化為僅包含相關條款。其他過濾器工作正常,沒有任何問題。
SELECT * FROM 表 ORDER BY sort_column sort_dir
SELECT * FROM 表 ORDER BY CASE sort_column
當 'col1' 那麼 col1_name
WHEN 'col2' THEN col2_name END
CASE sort_dir WHEN 'asc' THEN ASC
ELSE DESC END
我以 _ 格式將 2 個輸入連接到 1 個輸入,並嘗試了以下操作:
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
我總是收到錯誤#1064。上述每種情況下它都不同,但始終指向“CASE”部分。這是上面提到的選項 2 的錯誤
##1064 - 您的SQL 語法有錯誤;檢查與您的MySQL 伺服器版本相對應的手冊,了解在第4 行的'WHEN 'col1' THEN col1_name END CASE 'asc' WHEN 'desc ' THEN DESC ELSE ' 附近使用的正確語法
問題似乎不是列名。這是一個不起作用的排序方向。如果我在沒有“ASC”和“DESC”部分的情況下嘗試上述每個選項,則沒有問題。
我在這裡做錯了什麼嗎? 除了 CASE 之外還有更好的方法嗎?
MySQL版本:5.6
最好的方法是多個
案例
:這可能看起來很冗長。但是,請記住
CASE
是傳回單一值的表達式。因此,您不能將ASC
和DESC
作為THEN
的一部分。同樣重要的是資料類型的問題。 SQL 編譯器決定
CASE
表達式的單一型別。當列具有不同類型時,這可能會導致意外問題。最簡單的解決方案就是使用多個
CASE
表達式。