SQL条件中的变量

时间:2019-05-09 20:37:16

标签: sql-server where-clause

在创建条件where子句时,我需要一些帮助。我想做的是,如果我使用的变量之一为空,则使用特定的where子句,否则使用该变量

例如,我有客户表,客户和其他客户详细信息。除此之外,我还有InsertDate和UpdateDate。

Declare @CustomerID Nvarchar(20) = '';
Declare @StartDate Date = '2019-05-05'
Declare @EndDate Date = DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE()) - 1, -1);

在这里,我将@CustomerID保留为空。因此,如果该字段为空,则使用@StartDate和@EndDate之间的InsertDate查找数据,否则通过CustomerID查找数据。

但是当我尝试这样做时,我对此有疑问。

Select
   * 
From
   CustomerDetals 
where
   (
      Case
         When
            ISNULL(@CustomerID, '') = '' 
         Then
            Convert(Date, InsertDate) >= @StartDate 
            and Convert(Date, InsertDate) <= @EndDate 
         Else
            CustomerID = @CustomerID 
      End
   )

我遇到的错误是

  

“>”附近的语法不正确。

我该如何解决?

如果您对此信息不清楚或不确定,我们可以在评论中进行讨论,而不是直接将其降级。

3 个答案:

答案 0 :(得分:0)

  

1。您可以使用此语句

    Select * CustomerDetals 
    where (  ISNULL(@CustomerID, '')= 0 and Convert(Date, InsertDate) >= 
    @StartDate and Convert(Date, InsertDate)<=@EndDate ) 
    or (CustomerID = @CustomerID )
  

2。您可以编写动态查询

DECLARE @sqlCommand nvarchar(1000) 
Declare @CustomerID Nvarchar(20) = '' 
Declare @StartDate Date = '2019-05-05'
Declare @EndDate Date = DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE()) - 1, -1);
SET @sqlCommand = 'Select * from CustomerDetals where 1=1 '

IF ISNULL(@CustomerID, '')= ''
BEGIN
     SET @sqlCommand +=' and Convert(Date, InsertDate) >='''+ @StartDate + ''' and 
     Convert(Date, InsertDate)<= ''' + @EndDate + ''''
END

ELSE     
BEGIN
     SET @sqlCommand +=' and CustomerID = ''' + @CustomerID + ''''
END

EXECUTE sp_executesql @sqlCommand 

答案 1 :(得分:0)

我从哪里开始。首先,正确设置代码格式,以便于阅读。

#imagem_destaque{
  min-height: 250px;
  max-width: 300px;
}

#titulo_menu{
  max-width: 300px;
  background-color:#C2C23A;
  font-weight: bold;
  font-size: 20px;
  color: white;
  line-height: 2;
  padding-left: 10px;
}

#titulo_menu:hover{
  color: white;
  text-decoration:none;
}

第一个错误,没有Select * CustomerDetals where ( Case When ISNULL(@CustomerID, '')= '' Then Convert(Date, InsertDate) >= @StartDate and Convert(Date, InsertDate)<=@EndDate Else CustomerID = @CustomerID End ) 关键字。 第二个错误,您打算在FROM语句中做什么?甚至没有意义。

答案 2 :(得分:0)

我会像这样查询这个问题。

Select * 
From CustomerDetals 
WHERE
(
    Convert(Date, InsertDate) >= @StartDate 
    and 
    Convert(Date, InsertDate) <= @EndDate 
    AND
    @CustomerID IS NULL
)
OR 
(
    CustomerID = @CustomerID
)