2013-09-23 46 views
1

我試圖構造一個簡單的查詢,它將允許用戶根據人口統計信息篩選客戶端列表。在我看來,這LIKE將是最簡單的解決方案,例如:如何使用多個參數進行搜索,同時在SQL-Server的結果中包含空值

SELECT D.Name 
FROM demographics D 

WHERE D.City LIKE @cityVar 
AND D.Sex LIKE @sexVar 
AND D.Age LIKE @ageVar 
... 

變量傳遞到使用組合框的查詢;因此如果用戶決定不根據任何給定的參數進行過濾,我只需將'%'傳遞給該變量,從而有效地轉義WHERE子句中的該行。

但是,如果我想要返回包含過濾字段中的NULL值的行,這不起作用。例如,如果D.Employer的值爲NULL,則客戶失業;但通過'%'@employedVar(意味着用戶想要返回就業和失業客戶)忽略D.EmployerNULL的所有行。

我該如何構造WHERE子句的邏輯,以考慮大量參數,同時仍允許用戶對任何給定參數進行轉義過濾,包括NULL的值在適當的時候?

回答

1

最簡單的是做這樣的事情

SELECT D.Name 
FROM demographics D 
WHERE (D.City LIKE @cityVar OR @cityVar == '%') 
    AND (D.Sex LIKE @sexVar OR @sexVar == '%') 
    AND (D.Age LIKE @ageVar OR @ageVar == '%') 

使用類似

SELECT D.Name 
FROM demographics D 
WHERE ISNULL(D.City. '') LIKE @cityVar 
    AND ISNULL(D.Sex, '') LIKE @sexVar 
    AND ISNULL(D.Age, '') LIKE @ageVar 

傳遞值到一個函數的意志是很重要的說得那麼SQL服務器無法使用這些列上可能具有的任何索引。這將導致查詢計劃效率低下,性能下降。

+0

在第一個示例中,交換OR的順序可能會提高性能(由於短路),但我現在無法對其進行測試。 – cadrell0

1

這可能適合你。如何解釋程序中的null以表明用戶想要的一切除了null。換句話說,如果用戶沒有指定任何東西,讓我們給他們帶回值。因此,像這樣:

SELECT ... 
FROM ... 
WHERE ((@parm1 IS NULL AND field1 IS NOT NULL) OR 
     (field1 LIKE '%' + @parm1 + '%')) 

這個查詢將返回有一個值如果用戶沒有指定任何東西都行,但如果他們這樣做將運行LIKE

這只是意味着從應用程序,如果用戶沒有指定任何東西(也許在你的情況下指定所有)發送null的程序。

相關問題