【问题标题】:error 156 severity 15 state 1 using syntax CASE WHEN ELSE END错误 156 严重性 15 状态 1 使用语法 CASE WHEN ELSE END
【发布时间】:2019-10-29 18:08:21
【问题描述】:

当 @Keyword 从 Store 过程中声明时,我有新的 WHERE 条件。但是当我尝试 CASE 语法时,出现错误“关键字‘LIKE’附近的语法不正确。”

我在 PostgreSQL 中尝试过这种 CASE 语法,但没有错误。

ALTER PROCEDURE [dbo].[ACC_SEARCH_INVOICE_DATEX]
@projectID  varchar(3),
@FromDate DATETIME,
@Todate DATETIME ,
@Filter varchar(50),
@Keyword varchar(50),
@posted int,

@status integer,
@source varchar(50)
AS

SELECT posted, InvoiceHead.InvoiceID, InvoiceHead.Date AS date, InvoiceHead.UserID, InvoiceHead.CreditTerm, InvoiceHead.DueDate, InvoiceHead.CustomerID, 
Party.Name, InvoiceHead.Total, InvoiceHead.Currency, InvoiceHead.Rate, Subtotal, Discount, Tax, Commision, Bonus, Total, DownPayment, Balance ,
substring(InvoiceID,4,LEN(invoiceid)-11-3) Source, selling, technician, Lock , InvoiceHead.Status

FROM InvoiceHead LEFT OUTER JOIN Party ON InvoiceHead.CustomerID = Party.PartyID  

WHERE 

CASE
 WHEN @Keyword = 'SCP' 
    THEN ((InvoiceHead.InvoiceID LIKE '%' + @Keyword + '%') or (InvoiceHead.InvoiceID LIKE '%SCJ%'))
 WHEN  @Keyword = 'SCNH' 
    THEN ((InvoiceHead.InvoiceID LIKE '%' + @Keyword + '%') or (InvoiceHead.InvoiceID LIKE '%SNJH%'))
 WHEN  @Keyword = 'SCNHL' 
    THEN ((InvoiceHead.InvoiceID LIKE '%' + @Keyword + '%') or (InvoiceHead.InvoiceID LIKE '%SNJHL%'))
 ELSE ((InvoiceHead.InvoiceID LIKE '%' + @Keyword + '%'))
END

ORDER BY   InvoiceHead.InvoiceID

【问题讨论】:

    标签: sql sql-server switch-statement


    【解决方案1】:

    你应该重构条件:

    WHERE 
    (CASE
     WHEN @Keyword = 'SCP'   AND ((InvoiceHead.InvoiceID LIKE '%' + @Keyword + '%') or (InvoiceHead.InvoiceID LIKE '%SCJ%'))   THEN 1
     WHEN @Keyword = 'SCNH'  AND ((InvoiceHead.InvoiceID LIKE '%' + @Keyword + '%') or (InvoiceHead.InvoiceID LIKE '%SNJH%'))  THEN 1
     WHEN @Keyword = 'SCNHL' AND ((InvoiceHead.InvoiceID LIKE '%' + @Keyword + '%') or (InvoiceHead.InvoiceID LIKE '%SNJHL%')) THEN 1
     WHEN ((InvoiceHead.InvoiceID LIKE '%' + @Keyword + '%')) THEN 1
    END) = 1
    

    【讨论】:

    • 虽然这样可行,但实际上应该重写为where (..) or (..) or (..)
    • @GSerg 是的,这是另一种可能性。我只是想指出 THEN 之后的 CASE 表达式应该返回值而不是另一个条件。
    【解决方案2】:

    你可以像下面这样使用

    
    WHERE (@Keyword = 'SCP'   AND ((InvoiceHead.InvoiceID LIKE '%' + @Keyword + '%') or (InvoiceHead.InvoiceID LIKE '%SCJ%'))) 
      OR  (@Keyword = 'SCNH' AND ((InvoiceHead.InvoiceID LIKE '%' + @Keyword + '%') or (InvoiceHead.InvoiceID LIKE '%SNJH%')))
      OR  (@Keyword = 'SCNHL' AND ((InvoiceHead.InvoiceID LIKE '%' + @Keyword + '%') or (InvoiceHead.InvoiceID LIKE '%SNJHL%')))
    
    

    【讨论】:

      【解决方案3】:

      您可以在没有case 的情况下构建此逻辑。我会推荐以下内容:

      WHERE InvoiceHead.InvoiceID LIKE '%' + @Keyword + '%') OR
            (@Keyword = 'SCP' AND InvoiceHead.InvoiceID LIKE '%SCJ%') OR
            (@Keyword = 'SCNH' AND InvoiceHead.InvoiceID LIKE '%SNJH%') OR
            (@Keyword = 'SCNHL' AND InvoiceHead.InvoiceID LIKE '%SNJHL%');
      

      SQL Server 没有布尔类型。您收到错误是因为您的 CASE 表达式正在返回布尔表达式,但这不是 SQL Server 中的有效值。

      一般来说,对WHERE 条件使用布尔运算符比引入CASE 更简单。

      【讨论】:

        猜你喜欢
        • 2017-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多