簡體   English   中英

如何在WHERE子句的變量中使用AND

[英]How to use the AND in a variable in the WHERE clause

我試圖在變量中使用AND運算符,並在WHERE子句中使用它。 我正在嘗試不使用動態SQL來執行此操作。 即不將整個查詢分配給變量。

DECLARE @v_Criteria varchar(500)
DECLARE @jobtype varchar(500) = 'test Job'

    IF @inparam ='Report1'
        BEGIN
            SET @v_Criteria= ''
        END
    ELSE IF @inparam='Report2'
        BEGIN
            SET @v_Criteria= ' AND InvoiceValue IS NOT NULL'
        END


    SELECT *
    FROM tblJobs
    WHERE  JobID NOT IN (63,87,469)    
      AND JobType LIKE '%' + @jobtype + '%' 
      + @v_Criteria

我在@v_Criteria之前使用+運算符,但是沒有任何結果。 如果在@v_Criteria之前使用&運算符,則會出現錯誤。 任何幫助將不勝感激

在添加“ AND”之前,如果您檢查@v_Criteria是否不是空字符串,則不會出現任何錯誤。

因此,將AND與例如“ AND InvoiceValue IS NOT NULL”分開,然后根據@v_Criteria的值添加或不添加AND

那這個解決方案呢?

DECLARE @v_Criteria varchar(500)
DECLARE @jobtype varchar(500) = 'test Job'

    IF @inparam ='Report1'
        BEGIN
            SET @v_Criteria= ''
        END
    ELSE IF @inparam='Report2'
        BEGIN
            SET @v_Criteria= ' AND InvoiceValue IS NOT NULL'
        END


    SELECT *
    FROM tblJobs
    WHERE  JobID NOT IN (63,87,469)    
      AND JobType LIKE '%' + @jobtype + '%' 
      AND ISNULL(InvoiceValue, '') NOT LIKE CASE
                                                 WHEN @inparam = 'Report2'
                                                 THEN ''
                                                 ELSE 'SOMEIMPOSSIBLEVALUE'
                                                 END

您不能在查詢后附加“字符串”,它會成為代碼的一部分。 它仍然只是一個字符串。 本質上,您正在嘗試執行動態SQL,但隨后又說您不想使用動態SQL?

一種選擇是在SQL中為兩種情況構建邏輯...

SELECT *
FROM tblJobs
WHERE JobID NOT IN (63,87,469)    
  AND JobType LIKE '%' + @jobtype + '%'
  AND (
    (@inparam ='Report1')
    OR 
    (@inparam ='Report2' AND InvoiceValue IS NOT NULL)
  )

這意味着查詢計划者必須始終應對這兩種情況。 解決這兩種情況的一種計划。 這樣可以節省您的鍵入時間,但可能意味着執行計划不正確,浪費了資源或執行時間。

為了解決這個問題,您需要兩個查詢...

IF (@inparam = 'Report1')
BEGIN
  SELECT *
  FROM tblJobs
  WHERE JobID NOT IN (63,87,469)    
    AND JobType LIKE '%' + @jobtype + '%'
END
ELSE IF (@inparam = 'Report2')
BEGIN
  SELECT *
  FROM tblJobs
  WHERE JobID NOT IN (63,87,469)    
    AND JobType LIKE '%' + @jobtype + '%'
    AND InvoiceValue IS NOT NULL
END

或者只是使用動態SQL ...

SET @sql= 'SELECT *
             FROM tblJobs
            WHERE JobID NOT IN (63,87,469)    
              AND JobType LIKE ''%''' + @jobtype + '%''' + @v_Criteria

EXEC sp_executesql @sql

要么...

SET @sql= 'SELECT *
             FROM tblJobs
            WHERE JobID NOT IN (63,87,469)    
              AND JobType LIKE ''%'' + @jobtype_param + ''%''' + @v_Criteria

EXEC sp_executesql
         @sql,
         N'@jobtype_param varchar(500)',
         @jobtype_param = @jobtype

(這樣做的好處是,您不會為每個@jopbtype都制定一個新的緩存查詢計划。相反,它將制定一個參數化查詢計划並重新使用它。)


編輯:

基本上,您要研究的是動態搜索。

如果它比本示例復雜,我強烈建議您閱讀以下文章: http : //www.sommarskog.se/dyn-search.html

它很復雜而且很深入,您將學到很多有價值的課程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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