2016-12-26 47 views
1

用戶有三個文本框名稱,號碼,電子郵件。用戶可以在三個文本框中輸入詳細信息或可以是兩個或一個基於輸入數據有一個表'tblSample'。 'tblSample'Name,Number,Email,Adress,Contact Number寫作條件的有效方式

例如,如果用戶只輸入Name作爲'Sai Bharath',我應該顯示錶'tblSample' Where Name='Sai Bharath'中的所有詳細信息。與該用戶可能輸入兩個文本框或三個文本框什麼是最好和最簡單的方式來獲取此?下面的代碼

+0

在您的應用程序客戶端中構建Sql命令。 – Serg

回答

0

使用是得到的結果最簡單的方法:

SELECT * FROM #tblSample 
WHERE (@name <> '' AND Name = @Name) OR 
    (@number <> 0 AND Number = @number) OR 
    (@email <> '' AND Email= @email) 
+0

它不會支持NULL = NULL,你可以測試我的示例數據,它將只返回一行,但我們有兩行?無論如何,你應該處理空狀態。 – Susang

+0

@ Suraz,我現在更新了我的answer.check – Mansoor

0

您可以使用SQL Server使用COALESCE()功能。您的陳述中不需要使用IF- ElseCASE。以下是如何使用COALESCE功能。

SELECT * FROM tblSample where Name= COALESCE(NULLIF(@Name, ''), Name) and Address= COALESCE(NULLIF(@Address, ''), Address) and Email= COALESCE(NULLIF(@Email, ''), Email) and [ContactNumber= 
COALESCE(NULLIF(@ContactNumber, ''), ContactNumber) 

COALESCE函數在SQL返回其自變量之中的第一非空表達式。例如,如果@Name等於null,那麼函數將返回Name,這將導致where語句中的Name = Name,就像1 = 1,這意味着條件將始終爲真。

+1

「Name = Name ..這就像1 = 1」,除了Name是NULL。 – Serg

+0

它不會支持NULL = NULL,你可以測試我的示例數據,它將只返回一行,但我們有兩行?無論如何,你應該處理空狀態。 – Susang

0

我們可以檢查條件,如果只有變量/參數有值,否則我們可以通過檢查null來返回true,但如果沒有任何變量有值,它將返回所有記錄。我們可以通過強制的變量附加條件避免這種情況,如果我們有:

CREATE TABLE #tblSample(NAME VARCHAR(50),Number INT,Email VARCHAR(50)) 
INSERT INTO #tblSample VALUES 
('Tom', 001122, '[email protected]'), 
('Usy', 001123, '[email protected]'), 
('Nuse', 001124, '[email protected]'), 
('Tom', NULL, '[email protected]') 

DECLARE @name VARCHAR(50) = 'Tom', @number INT, @email VARCHAR(50) 

SELECT * 
FROM #tblSample 
WHERE 1 = 1 
AND (@name IS NULL OR NAME = @name) 
AND (@number IS NULL OR number = @number) 
AND (@email IS NULL OR email = @email) 

輸出:

NAME Number Email 
Tom  1122 [email protected] 
Tom  NULL [email protected] 
0

因爲你所談論的文本框,我想你有某種服務層的調用你的程序來自數據層。一種方法是使用實​​體框架和LINQ2SQL生成過濾場景所需的最小查詢。

一種可能的方式做到這一點:

// no need to track the entities, since you are just reading the data 
var query = DataContext.Set<Person>().AsNoTracking(); 

// query can be built step by step and will be as simple as possible 
if (!string.IsNullOrWhiteSpace(name)) 
    query = query.Where(p => p.Name == name); 
if (number.HasValue) 
    query = query.Where(p => p.Number = number); 
if (!string.IsNullOrWhiteSpace(email)) 
    query = query.Where(p => p.email = email); 

// you can also TOP your record set, so that you do not bring a very large number of rows 
query = query.Take(100); 

// actually run the query and get the data 
var listOfPersons = query.ToList(); 

LINQ2SQL是非常強大的,可以允許部分匹配(含),如果需要的話。

存儲過程解決方案可能會導致parameter sniffing。但是,對於大量人員,仍然需要適當的索引來避免表掃描。