2014-10-02 3 views
1

Я пытаюсь написать предложение WHERE, которое фиксирует определенный набор параметров для одного экземпляра, а другой для другого экземпляра.Case in Where Clause Issue

Прямо сейчас я написал что-то вроде этого:

Where 
    s.ProjectID=110 
    and wfseg.SiteEventGroupID=3 
    and wfse.EventStatusID in (1,2) 
    CASE WHEN cf.PaperDocumentTypeID <> 1 
     THEN CAST(cf.DateUploaded as DATE) = '09/25/2014' 
     ELSE CAST(cf.DateUploaded as DATE) = '09/25/2014' AND CAST(cr.CheckDate as DATE) ='09/25/2014' 
    END 

Довольно много, если PaperDocumentType не 1, то он должен показать с параметрами CAST(cf.DateUploaded as DATE) = '09/25/2014', если документ находится в 1, то он должен показать следующие два параметры CAST(cf.DateUploaded as DATE) = '09/25/2014' AND CAST(cr.CheckDate as DATE) ='09/25/2014'

Так что я получаю ошибки, прежде чем запускать их - не знаю, как я должен переписать, чтобы он работал правильно.

ответ

3

Это CASE WHEN, а не CASE WHERE.

+0

LOL Где только я, будучи дураком (пытаясь объединить все в простой лакомый из информации) - в самом запросе я имею Когда. Но все же даю мне ошибки. – StayPuft

2

Дайте ему попробовать

Where 
    s.ProjectID = 110 and 
    wfseg.SiteEventGroupID = 3 and 
    wfse.EventStatusID in (1,2) and 

    CAST(cf.DateUploaded as DATE) = @parameter and 
    CAST(cr.CheckDate as DATE) = (case when whencf.PaperDocumentTypeID <> 1 then @parameter else CAST(cr.CheckDate as DATE)END) 
+0

Не знаете, что этот параметр повлечет за собой? – StayPuft

+0

замените параметр на дату, которую вы хотите, как на примере, который вы указали, или выполните DECLARE @parameter DATETIME = '2014-09-25' перед запросом – mxix

1

первых, это было бы базировать случай, когда не СЛУЧАЙ WHERE. Кроме того, при выполнении запроса с датой CAST() с датой с полного дат будет предотвращен оптимизация такого индекса, который имеет поле даты.

также упростить ваш случай, когда условие, так как литая() является та же дата, независимо, он может быть сокращен до

s.ProjectID=110 
    and wfseg.SiteEventGroupID=3 
    and wfse.EventStatusID in (1,2) 
    and CAST(cf.DateUploaded as DATE) = '09/25/2014' 
    and ( cf.PaperDocumentTypeID = 1 
     OR (cf.PaperDocumentTypeID <> 1 and CAST(cr.CheckDate as DATE) ='09/25/2014')) 

не делать отливку, вы могли бы сделать ...

and cf.DateUploaded >= '2014-09-25' and cf.DateUploaded < '2014-09-26' 

Таким образом, он получает все время за 9/25 до 11:59:59 вечера. Дольше, но лучше, если дата является частью индекса.

1

Формат футляра не имеет слова «ГДЕ». (Link To MySQL Doc)

CASE cf.PaperDocumentTypeID <> 1 
THEN CAST(cf.DateUploaded as DATE) = '09/25/2014' 
ELSE CAST(cf.DateUploaded as DATE) = '09/25/2014' AND CAST(cr.CheckDate as DATE) ='09/25/2014' 
END 

Вы можете также использовать «когда» положение, чтобы сделать структуру более как переключатель «C», как это:

CASE cf.PaperDocumentTypeID 
WHEN 1 THEN CAST(cf.DateUploaded as DATE) = '09/25/2014' AND CAST(cr.CheckDate as DATE) ='09/25/2014' 
WHEN 2 THEN . . . 
WHEN 3 THEN . . . 
ELSE CAST(cf.DateUploaded as DATE) = '09/25/2014' 
END 

Во-вторых, я считаю, даты MySQL в формат «ГГГГ-ММ-ДД», но он может быть специфичным для локализации, поэтому я не уверен на 100%. Кроме того, не забудьте еще один способ создания дат - это функция DATE(). Я не уверен, что более эффективный CASE() или DATE().
Пример:

DATE(cf.DateUploaded) = '2014-09-25' 
+0

Yep - отредактировал оригинал, чтобы быть WHEN, но фактический запрос (без меня это редактирование краткий с моей проблемой) имеет КОГДА. Также я использую T-SQL не MYSql – StayPuft

+0

Но это довольно похоже (что вы дали), поэтому я дам ему попробовать (но дата не должна быть проблемой) – StayPuft