iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 9
0
Data Technology

SQL Server 學習日誌系列 第 9

09.[WHERE] 條件為 NULL 時回傳所有資料,非 NULL 時回傳符合條件資料

前言

[WHERE] 條件為 NULL 時回傳所有資料,非 NULL 時回傳符合條件資料這篇的題目很難想,只好直接將問題描述做成題目。這一篇也是撰寫某個功能遭遇到的問題,運氣很好的有程式碼可以參考。個人認為這個方法很特別,且未來很有機會再度用到,故特別撰寫此篇記錄。


問題說明

目前遇到的系統分成 前端 (AngularJS) ↔ 後端 (ASP.NET MVC API) ↔ 資料庫( MS SQL Server/Stored procedure)。多數資料取得是透過 Entity Framework,少數透過呼叫 Stored procedure。

https://d2mxuefqeaa7sj.cloudfront.net/s_12E7C682B0F9D088F12844D5BEFB9C76E16B4A31230F46865317F1B713A72DFB_1514388159468_image.png

遭遇問題的情境是前端搜尋條件為空白的時候,需要取得所有資料。而後端接到的前端查詢條件時,內容值為 NULL,理所當然,呼叫 Stored procedure 時給予的參數為 NULL。那我們該怎麼辦?範例如下:

TableA

Id Name Status Note
1 Maze 1 Leader
2 Luke 1 Member
3 Duran 2 Member
4 Casey 1 Member

我們有一個 SP,傳入參數為 note

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[usp_GetTeamMember]
     @note nvarchar(128)

AS
    BEGIN
       SET NOCOUNT ON;
       ...
       ...
    END;

SP 內容可以這樣撰寫

SELECT *
  FROM TableA
 WHERE (@note IS NULL OR Note = @note) 

整個SP會像這樣

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[usp_GetTeamMember]
  @note nvarchar(128)
AS
BEGIN

	SET NOCOUNT ON;

   SELECT *
     FROM TableA
    WHERE (@note IS NULL OR Note = @note) 
END
GO

我們進行測試,效果還不錯

https://d2mxuefqeaa7sj.cloudfront.net/s_12E7C682B0F9D088F12844D5BEFB9C76E16B4A31230F46865317F1B713A72DFB_1514387590535_image.png

https://d2mxuefqeaa7sj.cloudfront.net/s_12E7C682B0F9D088F12844D5BEFB9C76E16B4A31230F46865317F1B713A72DFB_1514387550234_image.png


上一篇
08.使用 INSERT INTO … SELECT 輸入不重複資料
下一篇
10. 動態組合 SQL 與執行語法 - sp_executesql
系列文
SQL Server 學習日誌30

尚未有邦友留言

立即登入留言