2016-09-06 46 views
-1

在帶有where的查詢中,我需要仍然可以將所有行作爲結果。選擇使用WHERE的所有行

例如:

declare @Crit nvarchar(15) 
set @Crit = 'Package'; --as an example 

IF @Crit = '' 
    ¿¿?? 

SELECT * FROM Criterios 
WHERE CRITERIO = @Crit 

在這種情況下,如果我設置@Crit以「包」,它像一個正常的查詢,但該值如果我不設置任何值@Crit =' ',並且查詢不會引發任何事情。

我想在if裏面做什麼,是預先指定一個等於所有東西的值,從*中選擇*。

無論如何要實現這一目標嗎?

+0

你在找'LIKE'嗎? – techspider

+0

'其中CRITERIO = case時@Crit =''那麼CRITERIO else @Crit結束' – shawnt00

回答

2

你在談論一個有條件的WHERE子句,它可以通過多種方式實現。

一種方法是:

SELECT * 
FROM Criterios 
WHERE (CRITERIO = @Crit OR @Crit = '') 

另一種方法是使用動態SQL:

DECLARE @SQL NVARCHAR(1000) 
SET @SQL = 'SELECT * FROM Criterios' 

IF (@Crit <> '') 
    SET @SQL = @SQL + ' WHERE CRITERIO = @Crit' 

EXECUTE sp_executesql @SQL, N'@Crit VARCHAR(10)', @Crit 

有優點和缺點每個根據場景。動態SQL的可讀性通常較差,編寫起來較爲複雜(並且需要注意SQL注入),但是可以爲您提供更好的執行計劃,尤其是在更復雜的情況下,因爲您只能得到所需的確切條件。

+0

謝謝,作品完美。 – Piston

2

這樣做的典型方法是不通過參數值。

SELECT * FROM Criterios 
WHERE CRITERIO = @Crit 
OR @Crit IS NULL 

雖然要小心這種模式。您可以創建一些嚴重的性能問題。這篇文章詳細介紹瞭如何解決這個問題。

http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/

如果您使用的是空字符串卡住你可以稍微改變以上。

SELECT * FROM Criterios 
WHERE CRITERIO = @Crit 
OR @Crit = '' 
+0

謝謝,工作正常;) – Piston

0

考慮使用COALESCE函數返回的第一個非空值,如下

declare @Crit nvarchar(15) 
set @Crit = 'Package'; --as an example 

IF @Crit = '' 
    BEGIN 
     SET @Crit = NULL 
    END 

SELECT * FROM Criterios 
WHERE CRITERIO = COALESCE(@Crit, CRITERIO) 
1

您可以使用動態SQL來做到這一點。如果@crit爲null,則排除where子句,如果它不爲null,它將位於where子句中。

DECLARE @crit nvarchar(15) = 'Package' 
    ,@sqlStatement nvarchar(max) = 
    'SELECT * FROM Criterios' 
; 

SET @sqlStatement = CONCAT(@sqlStatement,'WHERE CRITERIO = ' [email protected]) 

EXEC sp_executesql @sqlStatement;