2011-03-03 9 views
0

這就是我所看到的我們所有列表中的時間。 必須爲2列做一個過濾器(我拿了一個簡短的例子,我們有50列的列表,看起來一樣...)SQL:構建過濾器 - 可以在沒有動態sql的情況下完成嗎?

我想知道是否有辦法做到這一點不同。 你們用什麼來過濾表中的記錄?

/* parameters */ 
@CostNumber = ... 
@Description = ... 
    /* parameters */ 

SET @strSQL = ' 
SELECT [CostLevelId], [CostNumber], [Description] 
FROM [CostLevel] 
WHERE 1 = 1 ' /* this looks weird, but we'll add the "WHERE" stuff easier */ 

IF (@CostNumber IS NOT NULL) 
BEGIN 
    SET @strSQL = @strSQL + ' AND [CostNumber] LIKE ''%' + REPLACE(@CostNumber,'''','''''') + '%'' ' 
END 

IF (@Description IS NOT NULL) 
BEGIN 
    SET @strSQL = @strSQL + ' AND [Description] LIKE ''%' + REPLACE(@Description,'''','''''') + '%'' ' 
END 

EXEC (@strSQL) 

回答

1

爲什麼不廢棄動態SQL方法?

/* parameters */ 
@CostNumber = ... 
@Description = ... 
    /* parameters */ 

SELECT [CostLevelId], [CostNumber], [Description] 
FROM [CostLevel] 
WHERE [CostNumber] LIKE '%' + @CostNumber + '%' 
AND [Description] LIKE '%' + @Description + '%' 

幾件事情要注意 - null S IN的@CostNumber@Description PARAMS - 你必須確保你將它們轉換爲空字符串。

你需要考慮的另一件事是@Description might包含一個%字符的事實,你必須逃避那LIKE才能正常工作。

0

我不知道該怎麼做時,LIKE運營商參與,使用比較操作我使用默認值來獲得這樣的事情時:

select * 
from dbo.SomeTable a 
where 
(a.IntColumn = @IntColumnValue or @IntColumnValue = -1) 
and (a.VarCharColumn = @VarCharValue or @VarCharValue = 'zzz') 

這樣,如果我不想應用特定的過濾器,我只是將其設置爲默認值(在此示例中爲-1zzz),因此其檢查總是符合實際。

使用LIKE運算符應該是類似的,也許你應該將默認值設置爲某種你知道永遠不會在你的數據中找到的字符串?像這樣?

where (a.VarCharColumn like '%' + @VarCharValue + '%' or @VarCharValue = '§§§TheDefaultValue§§§') 
0

我沒有辦法測試該ATM,但如何

SELECT [CostLevelId], [CostNumber], [Description] 
FROM [CostLevel] 
WHERE (@CostNumber IS NOT NULL AND [CostNumber] LIKE ''%' + REPLACE(@CostNumber,'''','''''') + '%'') 
OR 
(@Description IS NOT NULL AND [Description] LIKE ''%' + REPLACE(@Description,'''','''''') + '%'') 
GROUP BY [CostLevelId], [CostNumber], [Description] 

如果做不到這一點,你可以嘗試UNION代替OR(和分組)。

0

您可以測試以查看查詢中的值是否爲空,再加上您的條件和允許可選參數的an或statement。

這將適用於類似的聲明。

SELECT [CostLevelId], [CostNumber], [Description] 
FROM [CostLevel] 
WHERE 
    (@CostNumber is null or [CostNumber] LIKE '%'[email protected]+'%') 
    and 
    (@Description is null or [Description] LIKE '%'[email protected]+'%') 

如果你可以使用聚結,比較無論是人口變量,或者當變量爲空,本身就是一個直相等比較。

SELECT [CostLevelId], [CostNumber], [Description] 
FROM [CostLevel] 
WHERE 
    [CostNumber] = coalesce(@CostNumber,[CostNumber]) 
    and 
    [Description] = coalesce(@Description,[CostNumber]) 

請記住,這可能對您的查詢產生不利影響計劃在哪些變量設置有關,表人口和數據庫結構等,你甚至會發現動態SQL方法,儘管效率比這個執行其建設中的額外複雜性。

相關問題