簡體   English   中英

如何在 SQL 服務器中創建返回多個值的條件 WHERE 子句?

[英]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];

我會檢查@ARTICLENULL還是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM