在 SQL 中,您可以过滤 WHERE 子句中接受参数的 CASE 语句吗?

问题描述 投票:0回答:1

我正在构建一个脚本,该脚本在 SELECT 中有一个 CASE 语句,该语句表示如果一个表中的电子邮件序列 = x,则从另一个表中打印电子邮件 x。

CASE  
    WHEN DCL.EmailSequence = 1 THEN DCT.Email1  
    WHEN DCL.EmailSequence = 2 THEN DCT.Email2  
    WHEN DCL.EmailSequence = 3 THEN DCT.Email3  
END                                   as RecipientEmail

我有一个名为 @RecipientEmail 的参数,需要对此 CASE 语句进行过滤。因此,当我用户在“收件人电子邮件”字段中键入“x”时,它应该仅返回“x”电子邮件。我该怎么做呢?我在这里读到一篇文章说要在 WHERE 子句中重现 CASE 语句。所有其他过滤器都工作正常并且过滤正常。这是我的尝试:

CREATE PROCEDURE dbo.spRptAutomatedClaims (
  @PackageId  int = NULL,
  @CreatedBy   varchar(64) = NULL, 
  @RecipientEmail varchar(64) = NULL,
  @PackageName varchar(64) = NULL
)

AS


DECLARE @rc   int,
        @op   varchar(16),
        @obj  varchar(64)

DECLARE @DirContactList table (  
  DirContactId   int      not null,  
  EmailSequence  tinyint  not null  
)  
  
SET NOCOUNT ON
  
INSERT @DirContactList ( DirContactId, EmailSequence )  
EXEC @rc = spRptGetValidContacts @PackageId  
  
IF @rc <> 0  
BEGIN  
  SET @op  = 'exec'  
  SET @obj = 'spRptGetValidContacts'  
  GOTO OnError  
END  

SELECT 
RP.PackageId as PackageId,
RP.Name as PackageName,
MAX(EffectiveDate) as EffectiveDate, 
iif(RP.IsActive = 0, 'N', 'Y') as IsActive,
DCT.LastName + ', ' + DCT.FirstName as RecipientName, 
CASE  
    WHEN DCL.EmailSequence = 1 THEN DCT.Email1  
    WHEN DCL.EmailSequence = 2 THEN DCT.Email2  
    WHEN DCL.EmailSequence = 3 THEN DCT.Email3  
END                                   as RecipientEmail,
RS.Name AS Schedule,
RP.LastRun AS LastRunDate, 
RP.LastUpdated AS LastUpdated,
RP.CreatedBy

FROM RptPackage RP
LEFT JOIN dbo.RptPackageReport   AS RPR ON RPR.PackageId = RP.PackageId
LEFT JOIN dbo.RptPackageSchedule AS RPS ON RPS.PackageId = RP.PackageId
LEFT JOIN dbo.RptSchedule        AS RS  ON RS.ScheduleId = RPS.ScheduleId
LEFT JOIN dbo.DirCompany         AS DC  ON DC.Name = RP.Name
LEFT JOIN dbo.DirContact         AS DCT ON DCT.DirCompanyId= DC.DirCompanyId
LEFT JOIN @DirContactList        AS DCL ON DCT.DirContactId= DCT.DirContactId
LEFT JOIN PlcPolicy              AS P   ON P.AccountName = RP.Name 

WHERE

RP.PackageId = @PackageId
OR RP.CreatedBy = RTRIM(@CreatedBy) 
OR RP.Name = RTRIM(@PackageName)
OR @RecipientEmail= CASE  
    WHEN DCL.EmailSequence = 1 THEN DCT.Email1  
    WHEN DCL.EmailSequence = 2 THEN DCT.Email2  
    WHEN DCL.EmailSequence = 3 THEN DCT.Email3  
END                                   as RecipientEmail


GROUP BY RP.CreatedBy,
RP.Name,
iif(RP.IsActive = 0, 'N', 'Y'),
DCT.LastName + ', ' + DCT.FirstName, 
CASE  
    WHEN DCL.EmailSequence = 1 THEN DCT.Email1  
    WHEN DCL.EmailSequence = 2 THEN DCT.Email2  
    WHEN DCL.EmailSequence = 3 THEN DCT.Email3  
    
END,
RS.Name,
RP.LastRun, 
RP.LastUpdated,
RP.PackageId

ORDER BY RP.Name

我在运行时收到此错误:

消息 156,级别 15,状态 1,过程 spRptAutomatedClaims,第 72 行 [批量开始第 14 行]
关键字“as”附近的语法不正确。
消息 15151,16 级,状态 1,第 129 行
找不到对象“spRptAutomatedClaims”,因为它不存在或您没有权限。

sql tsql where-clause case
1个回答
0
投票

推广评论中的答案:

OP 在

WHERE
子句中包含别名定义

OR @RecipientEmail= CASE  
    WHEN DCL.EmailSequence = 1 THEN DCT.Email1  
    WHEN DCL.EmailSequence = 2 THEN DCT.Email2  
    WHEN DCL.EmailSequence = 3 THEN DCT.Email3  
END                                   as RecipientEmail

where 子句中别名定义无效,导致错误:

消息 156,级别 15,状态 1,过程 spRptAutomatedClaims,第 72 行 [批量开始第 14 行] 关键字“as”附近的语法不正确。 消息 15151,第 16 级,状态 1,第 129 行 找不到对象“spRptAutomatedClaims”,因为它不存在或您没有权限。

© www.soinside.com 2019 - 2024. All rights reserved.