搜尋

首頁  >  問答  >  主體

SQL Server:使用帶有 WHERE 子句的 CASE WHEN 表達式

我有一個有 SQL Server 的新 Spring Boot 項目,我需要用 SQL Server 本機查詢取代舊項目中儲存庫方法上的 MySQL 本機查詢。這是一個複雜的查詢,其中條件為 case when 表達式。當我嘗試在 SQL Server Management Studio 中測試該查詢時,它顯示如下圖所示的錯誤。 在此輸入圖像描述

這是我在儲存庫方法上使用 MySQL 的舊本機查詢,我想將其替換為 SQL Server 在此輸入影像描述 請幫我找到解決方案。 預先感謝您! !

P粉270842688P粉270842688263 天前518

全部回覆(1)我來回復

  • P粉904191507

    P粉9041915072024-04-04 13:18:23

    這就是您所擁有的內容以及您應該在問題中以文字形式發布的內容。作為文本,試圖幫助您的人可以搜尋和複製它。

    case when @num = 1 then p.merchant_name = @query else 1=1 end

    CASE 是 TSQL 中的運算式。它不像許多其他語言那樣是一種流控制結構。若要使用「可選」過濾器,您需要使用 CASE 建構一個布林運算式來正確處理「可選」屬性。通常,使用 CASE 可以更複雜地完成此操作,如下所示:

    case when @num = 1 and p.merchant_name <> @query then 0 else 1 end = 1

    所以這裡使用CASE來傳回一個可以在比較中測試的值。使用 0 或 1 並沒有什麼魔力。使用任何類型的任何值。

    • 當 @num 為 1 且值不符時,會傳回 THEN 分支 (0)。
    • 當 @num 為 1 且值相符時,傳回 ELSE 分支 (1)。
    • 當 @num 不是 1 時,傳回 ELSE 分支 (1)。

    因此,當 CASE 表達式傳回 0(實際上不是 1)時,該行將被忽略(從結果集中刪除)。

    鑑於您的查詢實際上是在應用程式中建立的,您應該考慮動態建立查詢並根據需要添加參數。這可能會產生更有效的查詢,資料庫引擎可以更好地優化該查詢。或者,您可以查看此廚房水槽討論和 Erland 的關於動態搜尋條件的討論。 TBH 看起來有人使用 @num 作為拼湊以避免為八個特定過濾器值添加參數。如果我想同時過濾商家名稱和商店名稱,則無法使用此方法。

    回覆
    0
  • 取消回覆