[英]How can I create a conditional WHERE clause in SQL Server that returns multiple values?
我有以下 SQL 代碼用於 SSRS 報告。 我簡化了代碼,因為原始查詢要長得多。 有一個用戶可以輸入的參數@ARTICLE。 我想要做的是創建一個條件 WHERE 語句。 如果用戶輸入文章編號 (@ARTICLE),則查詢應過濾 Table1 中與輸入的文章編號 (@ARTICLE) 與另一個表中的“詳細代碼”匹配的 ID 匹配的 ID。 如果沒有給出文章編號,則不要過濾(或跳過整個 WHERE 語句)
使用下面的代碼,我收到以下錯誤:
子查詢返回超過 1 個值。 當子查詢跟隨 =, ,=, <, <=, > 時,這是不允許的。 >= 或當子查詢用作表達式時。
邏輯上它在沒有 CASE 語句的情況下工作得很好,所以當只使用子查詢來檢查匹配的 ID 時。 但是,如果 @ARTICLE 參數有值,我只想返回匹配的 ID。 如果是 NULL 或空字符串,我想返回所有 ID(或跳過整個 WHERE 語句)。 如何在 WHERE 子句中包含允許返回多行的條件,給出以下示例?
我覺得我的方法很復雜,非常感謝任何幫助!
DECLARE @ARTICLE AS VARCHAR(50) = '1234567'
SELECT * FROM Table1
WHERE
Table1.ID IN (
CASE
WHEN ISNULL(@ARTICLE,'')<>'' THEN
(
SELECT ID
FROM Table2
WHERE detailcode IN (@ARTICLE)
)
ELSE Table1.ID
END
)
你是對的,你有點過於復雜了——如果你看一下LIKE
運算符,你可以這樣做:
DECLARE @filter NVARCHAR(50) = '123456';
DECLARE @f NVARCHAR(100) = '%' + @filter + '%';
SELECT *
FROM [Table1] AS [t1]
INNER JOIN [Table2] AS [t2]
ON [t2].[joinField] = [t1].[joinField]
AND [t2].[detailCode] LIKE @f;
其中@filter
是存儲過程的參數。
或者說明detailCode
為 null:
DECLARE @filter NVARCHAR(50) = '123456';
DECLARE @f NVARCHAR(100) = '%' + @filter + '%';
IF @filter != NULL
SELECT *
FROM [Table1] AS [t1]
INNER JOIN [Table2] AS [t2]
ON [t2].[joinField] = [t1].[joinField]
AND [t2].[detailCode] LIKE @f;
ELSE
SELECT *
FROM [Table1] AS [t1]
INNER JOIN [Table2] AS [t2]
ON [t2].[joinField] = [t1].[joinField];
我會檢查@ARTICLE
是NULL
還是NOT NULL
並且您的子查詢已完成,如下所示:
WHERE
ISNULL(@ARTICLE, '') = ''
OR
(
ISNULL(@ARTICLE, '') <> ''
AND ID IN
(
SELECT ID FROM Table2
WHERE detailcode = @ARTICLE
)
)
也許你可以做完全不同的事情,例如存在。
因此,當@ARTICLE is null or ''
或exists at least one row in table2 with this article
一行時,您將返回所有行
當變量為 null 或 '' 時, OR
將產生不進行過濾的效果
DECLARE @ARTICLE AS VARCHAR(50) = '1234567'
select t1.*
from table1 t1
where ( isnull(@ARTICLE, '') = ''
or
exists ( select 1 from table2 t2 where t2.detailcode = @ARTICLE )
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.