我有一個有 SQL Server 的新 Spring Boot 項目,我需要用 SQL Server 本機查詢取代舊項目中儲存庫方法上的 MySQL 本機查詢。這是一個複雜的查詢,其中條件為 case when 表達式。當我嘗試在 SQL Server Management Studio 中測試該查詢時,它顯示如下圖所示的錯誤。 在此輸入圖像描述
這是我在儲存庫方法上使用 MySQL 的舊本機查詢,我想將其替換為 SQL Server 在此輸入影像描述 請幫我找到解決方案。 預先感謝您! !
這就是您所擁有的內容以及您應該在問題中以文字形式發布的內容。作為文本,試圖幫助您的人可以搜尋和複製它。
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 並沒有什麼魔力。使用任何類型的任何值。
因此,當 CASE 表達式傳回 0(實際上不是 1)時,該行將被忽略(從結果集中刪除)。
鑑於您的查詢實際上是在應用程式中建立的,您應該考慮動態建立查詢並根據需要添加參數。這可能會產生更有效的查詢,資料庫引擎可以更好地優化該查詢。或者,您可以查看此廚房水槽討論和 Erland 的關於動態搜尋條件的討論。 TBH 看起來有人使用 @num 作為拼湊以避免為八個特定過濾器值添加參數。如果我想同時過濾商家名稱和商店名稱,則無法使用此方法。
@num
這就是您所擁有的內容以及您應該在問題中以文字形式發布的內容。作為文本,試圖幫助您的人可以搜尋和複製它。
CASE 是 TSQL 中的運算式。它不像許多其他語言那樣是一種流控制結構。若要使用「可選」過濾器,您需要使用 CASE 建構一個布林運算式來正確處理「可選」屬性。通常,使用 CASE 可以更複雜地完成此操作,如下所示:
所以這裡使用CASE來傳回一個可以在比較中測試的值。使用 0 或 1 並沒有什麼魔力。使用任何類型的任何值。
因此,當 CASE 表達式傳回 0(實際上不是 1)時,該行將被忽略(從結果集中刪除)。
鑑於您的查詢實際上是在應用程式中建立的,您應該考慮動態建立查詢並根據需要添加參數。這可能會產生更有效的查詢,資料庫引擎可以更好地優化該查詢。或者,您可以查看此廚房水槽討論和 Erland 的關於動態搜尋條件的討論。 TBH 看起來有人使用
@num
作為拼湊以避免為八個特定過濾器值添加參數。如果我想同時過濾商家名稱和商店名稱,則無法使用此方法。