2016-12-19 4 views
-1

Я выбираю столбцы на основе case case и хочу, чтобы фильтр с предложением where на основе возвращаемого столбца в case case.SQL Server, где условие на основе выбранного столбца case

Select 
    case 
     when UpdatedDate is not null 
      then UpdatedDate 
     when InsertedDate is not null 
      then InsertedDate 
     else VisitedDate 
    end 
From 
    tbl_UserTracking 
where 
    [UpdatedDate/InsertedDate/VisitedDate(based on case)] between date1 and date2 
+0

Это, вероятно, будет лучше для всех, если бы не упростил вопрос. Если каждый, если эти столбцы даты имеют разные таблицы, и эти значения потенциально являются NULL из-за внешних соединений, то то, что делает в логике соединения и/или где, будет зависеть от данных и требуемого результата. Пожалуйста, пересмотреть вопрос, предоставляя более реалистичную версию. Также образцы данных оровиды и ожидаемый результат. Существуют руководства по тому, как задавать вопросы, чтобы получить лучшие результаты. –

ответ

1

Попробуйте

SELECT * FROM 
( SELECT case when UpdatedDate is not null then UpdatedDate 
       when InsertedDate is not null then InsertedDate 
       else VisitedDate END AS DateColumn 
    FROM tbl_UserTracking 
) T 
WHERE DateColumn BETWEEN date1 AND date2 
+0

не даст проблемы с производительностью? потому что огромные данные будут возвращены из внутреннего запроса с фильтрацией даты. – Gopinath

+0

* Наверное * нет. Я предполагаю, что у вас будет либо сканирование таблицы, либо индексное сканирование для этого запроса независимо. Запустите анализатор запросов и загляните в план запроса, если вы беспокоитесь об этом. –

0
SELECT COALESCE(UpdatedDate, InsertedDate, VisitedDate) AS DateColumn 
FROM tbl_UserTracking 
WHERE COALESCE(UpdatedDate, InsertedDate, VisitedDate) BETWEEN @date1 AND @date2 
+0

Столбцы из разных таблиц и условия случая также различны, я просто упрощенные условия. – Gopinath

+0

@Gopinath У вас может быть COALESCE (T1.UpdatedDate, T3.InsertedDate, T8.VisitedDate) – JBrooks

0

Использование coalesce(). Это упрощает where положение:

Select coalesce(UpdatedDate, InsertedDate, VisitedDate) 
From tbl_UserTracking 
where coalesce(UpdatedDate, InsertedDate, VisitedDate) between date1 and date2; 

Если вы хотите определить переменную, которую можно использовать КТР или подзапрос. Я хотел бы отметить, боковые соединения, которые в службах SQL Server использует apply ключевое слово:

Select v.thedate 
From tbl_UserTracking t outer apply 
    (values (coalesce(UpdatedDate, InsertedDate, VisitedDate)) 
    ) v(thedate) 
where v.thedate between date1 and date2; 
Смежные вопросы