ошибка 156, уровень серьезности 15, состояние 1 с использованием синтаксиса CASE WHEN ELSE END - PullRequest
1 голос
/ 15 июня 2019

У меня новое условие WHERE, когда @Keyword объявляется из процедуры Store.но когда я попробовал синтаксис CASE, у меня появляется ошибка «Неверный синтаксис рядом с ключевым словом« LIKE ».»

Я пробовал этот синтаксис CASE в PostgreSQL, но без ошибки.

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

Ответы [ 3 ]

0 голосов
/ 15 июня 2019

вы можете использовать, как показано ниже


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%')))

0 голосов
/ 15 июня 2019

Вы можете создать эту логику без 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.

0 голосов
/ 15 июня 2019

Вы должны изменить условия:

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
...