SQL Server: CASE WHEN в предложении WHERE с IN - PullRequest
0 голосов
/ 21 марта 2019

Мы уже несколько лет используем SQL, но требования изменились, и у меня возникла проблема с обновлением SQL.Нам нужно использовать другой оператор IN, основанный на OrderCompletedDate.Если до 3/1/19, используйте в списке операторов IN, и если после, используйте другой.Я думал, что это был простой случай, когда, но не уверен сейчас.

Вот фрагмент кода:

SELECT
    CAST(DATEADD(MONTH, DATEDIFF(MONTH, 0, ER.CreatedDateTime), 0) AS DATE) AS [MonthYear],
    COUNT(ER.RegistrationID) AS TotalCounts
FROM
    EventReg ER
WHERE 
    ER.OptedIn IS NOT NULL
    AND (ER.Phone IS NOT NULL or ER.CellPhone IS NOT NULL)
    AND (ER.BillingZip IN (CASE 
                              WHEN ER.CreatedDateTime >= '3/1/2019 12:00 AM' 
                                 THEN '12345', '45678', '90123'
                           END)
         OR ER.BillingZip NOT IN (CASE 
                                     WHEN ER.CreatedDateTime < '3/1/2019 12:00 AM' 
                                        THEN '07017', '07018',  '07019'
                                  END))
GROUP BY 
    DATEADD(MONTH, DATEDIFF(MONTH, 0, ER.CreatedDateTime), 0)
ORDER BY 
    DATEADD(MONTH, DATEDIFF(MONTH, 0, ER.CreatedDateTime), 0) ASC

Это явно не правильно, так как вы не можете иметь список предметов в случае / когда, как я выяснил.Я хотел обернуть CASE WHEN снаружи и затем выполнить весь запрос внутри каждого WHEN, но я просто продолжаю получать синтаксические ошибки.Пример:

AND (
   CASE 
     WHEN ER.CreatedDateTime >= '3/1/2019 12:00 AM' THEN 
       ER.BillingZip IN (
          '12345', '45678', '90123'
       )
     WHEN ER.CreatedDateTime < '3/1/2019 12:00 AM' THEN 
       ER.BillingZip NOT IN (
          '07017', '07018',  '07019'
       )
   END
)

Подход, вероятно, неправильный, но я не могу придумать, как обойти это, поскольку нам нужно сделать перерыв 3/1 без двух разных запросов, которых я стараюсь избегать.

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

4 голосов
/ 21 марта 2019

Это должно работать с использованием ИЛИ

SELECT
   CAST(DATEADD(MONTH, DATEDIFF(MONTH, 0, ER.CreatedDateTime), 0) AS DATE) AS [MonthYear],
   COUNT(ER.RegistrationID) AS TotalCounts
FROM
    EventReg ER
WHERE ER.OptedIn IS NOT NULL
AND (ER.Phone IS NOT NULL or ER.CellPhone IS NOT NULL)


AND (
        (
            ER.CreatedDateTime >= '3/1/2019 12:00 AM' 
            AND ER.BillingZip IN ('12345', '45678', '90123')
        )
        OR -- do OR here to do either one of these
        (
            ER.CreatedDateTime < '3/1/2019 12:00 AM'
            AND ER.BillingZip NOT IN ('07017', '07018',  '07019')
        )
    )


GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, 0, ER.CreatedDateTime), 0)
ORDER BY DATEADD(MONTH, DATEDIFF(MONTH, 0, ER.CreatedDateTime), 0) ASC
3 голосов
/ 21 марта 2019

Просто выразите это как логическую логику:

AND ( (ER.CreatedDateTime >= '2019-03-01' AND ER.BillingZip IN ('12345', '45678', '90123')) OR
      (ER.CreatedDateTime < '2019-03-01' AND ER.BillingZip NOT IN ('07017', '07018',  '07019'))
    )

Обратите внимание, что я установил формат даты как стандартный формат и логику, чтобы она охватывала ровно полночь 2019-03-01.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...