Условие SQL где с точки зрения переменной - PullRequest
0 голосов
/ 09 мая 2019

Мне нужна помощь в создании условия, где оговорка. То, что я пытаюсь сделать, это если одна из переменных, которые я использую, пуста, тогда использовать специальное предложение 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 как пустой. Так что, если это пустое значение, найдите данные, используя InsertDate между @StartDate и @EndDate, иначе найдите данные через 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 голосов
/ 10 мая 2019

С чего начать. Прежде всего, правильно отформатируйте код, чтобы его было легче читать.

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

Первая ошибка, ключевого слова FROM нет. Вторая ошибка, что вы пытаетесь сделать в операторе CASE? Это даже не имеет смысла.

0 голосов
/ 10 мая 2019

Я бы решил это как этот запрос.

Select * 
From CustomerDetals 
WHERE
(
    Convert(Date, InsertDate) >= @StartDate 
    and 
    Convert(Date, InsertDate) <= @EndDate 
    AND
    @CustomerID IS NULL
)
OR 
(
    CustomerID = @CustomerID
)
0 голосов
/ 10 мая 2019

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