我試圖將常規查詢構建轉換爲存儲過程。我不知道通過「構建」查詢來解決這個問題的最佳方式。不知道如何解釋,所以我會舉一個例子。我的例子是在PHP中,但任何語言的概念都是一樣的。例子應該足夠簡單。用if/else語句構建存儲過程?
if($somevar){
$w .= " AND SomeVar = '$somevar' ";
}
if($anothervar){
$w .= " AND AnotherVar = '$anothervar' ";
}
$sql = "SELECT * FROM MyTable WHERE Title = 'test' " . $w;
所以基本上如果這兩個都有一個值,則SQL將是:
SELECT * FROM MyTable WHERE Title = 'test' AND SomeVar = 'blah' AND
AnotherVar = 'blah'
因爲有此查詢的四種可能的變化,這將是「建設」的最佳方式使用存儲過程查詢?
繼承人的其他三種可能性:
SELECT * FROM MyTable WHERE Title = 'test' AND AnotherVar = 'blah'
SELECT * FROM MyTable WHERE Title = 'test' AND SomeVar = 'blah'
SELECT * FROM MyTable WHERE Title = 'test'
難道我通過BIND通過這兩個變量的SP,然後在SP做if/else語句。
如果是這樣,有人可以提供一個關於如何在SP中執行此操作的示例嗎?
或者,有沒有其他的方式來處理呢?
謝謝!
編輯:MySQL將被轉換從定期查詢MSSQL,存儲過程
編輯2:
根據喬·斯特凡內利的評論,我認爲這是回答我的問題,有什麼想法?
CREATE PROCEDURE testSP
@somevar varchar(50),
@anothervar varchar(50)
AS
SELECT * FROM MyTable WHERE Title = @title
AND ((SomeVar = @somevar AND @somevar IS NOT NULL) OR (@somevar IS NULL))
AND ((AnotherVar = @anothervar AND @anothervar IS NOT NULL) OR (@anothervar IS NULL))
對於SQL Server,請參閱Gail Shaw在[Catch-all queries]上的博文(http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/) –
了不起的信息, 謝謝! – tcarter2005
(IS NOT NULL)OR(IS NULL)的問題在於它在性能上是殺手級的。 –