2011-03-08 80 views
4

用戶可以按名字,姓氏搜索客戶,也可以選擇輸入城市。沒有動態SQL的動態搜索

只有當用戶使用動態SQL輸入一個W/O時,纔可以編寫與CITY相匹配的SQL?

CREATE PROCEDURE [dbo].[SearchCustomer] 
@FirstName varchar(30) --REQUIRED 
@LastName varchar(30)--REQUIRED 
@City varchar(30) --OPTIONAL 
AS 
SELECT * FROM CUSTOMER C WHERE 
C.FirstName = @FirstName AND 
C.LastName = @LastName AND 
C.City = IsNull(@City, C.City) --This won't Work if CITY is optional in the database 

回答

6

嘗試:

(@City is null OR C.City = @City) 
+0

這不會因爲工作的信息,在他們指定的地方的情況一個城市,查詢將返回客戶記錄w ith一個空城市。 – ChadD 2011-03-08 12:30:58

+0

@Velika:不應該,因爲null = null是不正確的。嘗試一下。 – Andomar 2011-03-08 12:39:51

+0

我的錯誤。不錯的工作。當你看到答案時很容易... – ChadD 2011-03-08 12:49:29

2

試試這個

COALESCE(C.City,"") = COALESCE(@City,C.City,"") 

更多關於此功能here

+0

+1。與我的想法相同的解決方案*(只有更快的大腦才能到達那裏)*。 *(自己的答案已刪除)* – 2011-03-08 12:36:23

+0

對於第二個答案,ISNULL函數只需要2個參數。不明白第一個YET – ChadD 2011-03-08 12:45:39

+0

@Velika,我的錯誤。我糾正了我的編輯。 – 2011-03-08 13:16:12

0
CREATE PROCEDURE [dbo].[SearchCustomer] 
@FirstName varchar(30) --REQUIRED 
@LastName varchar(30)--REQUIRED 
@City varchar(30) --OPTIONAL 
AS 

IF @City is NULL 
BEGIN 
SELECT * FROM CUSTOMER C WHERE 
C.FirstName = @FirstName AND 
C.LastName = @LastName 
END 
ELSE 
BEGIN 
SELECT * FROM CUSTOMER C WHERE 
C.FirstName = @FirstName AND 
C.LastName = @LastName AND 
C.City = @City 
END 
+0

是的,我認爲是這樣,但如果我們有2個或更多可以爲NULL的字段,排列可以得到手 – ChadD 2011-03-08 12:43:13