首頁  >  問答  >  主體

MySQL:如何對 ORDER BY 子句使用 CASE

我有一個預存程序,它必須在根據輸入過濾行後傳回一個表。其中兩個輸入是 sort_columnsort_dir。查詢必須在 sort_dir 方向(ASC 或 DESC)中 ORDER BY sort_column

我嘗試了以下查詢,但沒有成功。以下的查詢已被簡化為僅包含相關條款。其他過濾器工作正常,沒有任何問題。

  1. SELECT * FROM 表 ORDER BY sort_column sort_dir
  2. 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

  3. #
  4. 我以 _ 格式將 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

P粉463291248P粉463291248353 天前611

全部回覆(1)我來回復

  • P粉294954447

    P粉2949544472023-11-02 11:28:32

    最好的方法是多個案例

    ORDER BY (CASE WHEN sort_input = 'col1_asc' THEN col1_name END) ASC,
             (CASE WHEN sort_input = 'col1_desc' THEN col1_name END) DESC,
             (CASE WHEN sort_input = 'col2_asc' THEN col2_name END) ASC,
             (CASE WHEN sort_input = 'col2_desc' THEN col2_name END) DESC,

    這可能看起來很冗長。但是,請記住 CASE 是傳回單一值的表達式。因此,您不能將 ASCDESC 作為 THEN 的一部分。

    同樣重要的是資料類型的問題。 SQL 編譯器決定 CASE 表達式的單一型別。當列具有不同類型時,這可能會導致意外問題。

    最簡單的解決方案就是使用多個 CASE 表達式。

    回覆
    0
  • 取消回覆