SQL查询获取COLUMN1值,即使COLUMN 2具有值或NULL

时间:2017-07-19 00:19:40

标签: sql sql-server

我的数据库中有这些数据

Batch_Leads             CSP
BATCH 01_JUL 17_CURO    NULL
BATCH 01_JUL 17_STR     NULL
BATCH 02_JUL 17_SPI     NULL
BATCH 01_JUL 17_SPI     NULL
BATCH 03_JUL 17_CURO    NULL
BATCH 02_JUL 17_CURO    NULL
BATCH 01_JUL 17_CURO    CURO
BATCH 02_JUL 17_CURO    CURO
BATCH 03_JUL 17_CURO    CURO
BATCH 01_JUL 17_CURO    SPI
BATCH 02_JUL 17_SPI     SPI
BATCH 01_JUL 17_SPI     SPI
BATCH 01_JUL 17_STR     Sterling

这是我到目前为止所做的工作

DECLARE @DateFrom date = '7/17/2017',
@DateTo date = '7/17/2017',
@CSP nvarchar(max) = N'CURO',
@Batch nvarchar(max) = 'BATCH 02_JUL 17_CURO'

DECLARE @DTimeFrom datetime,
@DTimeTo datetime

SET @DTimeFrom = @DateFrom
SET @DTimeTo = DATEADD(s,-1,CONVERT(Datetime,DATEADD(d,1,@DateTo)))


SELECT *--'1' as [SORT],'OverAll','FACTORS' as [Label],'Touched Leads',FORMAT(COUNT(*),'##,##0') as [Touched Leads],'SCPL' as [Link]
FROM [SCPL].[dbo].[SCPL_EOD_CSP]
WHERE [Date] BETWEEN @DateFrom AND @DateTo
AND 
(
    @Batch = 'All Batch'
    OR
    [BATCH_LEADS] COLLATE database_default IN ( SELECT value FROM dbo.FnSplit (@Batch,',')) --OR [BATCH_LEADS] <> NULL
)
--and [CSP] = @CSP

它工作正常如果我指定Batch_LeadsCSP它将显示我过滤的所有Batch_Leads甚至CSP都为空(因为我没有使用CSP作为过滤器。但是,如果我在CSP中指定CURO而在All Batch指定Batch_Leads则会显示包括Sterling在内的所有数据,因为我没有使用CSP列过滤但是当我使用CSP时,它不会显示带有null的数据。这就是为什么我对它进行评论。如果我在CSP CURO中指定,是否可以显示所有带有CURO的批量导向?是{{ 1}}是唯一的方法吗?因为我不想使用LIKE因为我认为将来我可能会遇到问题

2 个答案:

答案 0 :(得分:1)

如果你想使用

  

@CSP

  

BATCH_LEADS

作为过滤器,您真正需要做的就是:

SELECT *--'1' as [SORT],'OverAll','FACTORS' as [Label],'Touched Leads',FORMAT(COUNT(*),'##,##0') as [Touched Leads],'SCPL' as [Link]
FROM [SCPL].[dbo].[SCPL_EOD_CSP]
WHERE [Date] BETWEEN @DateFrom AND @DateTo
AND 
(
    @Batch = 'All Batch'
    OR
    [BATCH_LEADS] COLLATE database_default IN ( SELECT value FROM dbo.FnSplit (@Batch,',')) 
OR isnull([BATCH_LEADS],'') <> ''
)
and   isnull([CSP],'') = @CSP

答案 1 :(得分:1)

我猜你想要两件事之一:

(1)有时您希望按@CSP进行过滤,但有时您不想按此过滤。

然后,当您想忽略过滤器时,请执行以下操作:

SET @CSP = NULL

在你的WHERE条款中,请始终保留此信息:

AND [CSP] = ISNULL(@CSP, [CSP])

您也可以对批次执行相同操作,而不是撰写文本&#39;所有批处理&#39;。

(2)当您按@CSP过滤时,您还希望显示NULL

然后,您可以将其添加到您的WHERE子句:

AND ISNULL([CSP], @CSP) = @CSP

希望我能猜对你。