2013-05-09 278 views
0

我的查詢嵌套Case語句在SQL查詢

Declare  @From  DateTime='01 Feb 2013' 
Declare  @To   DateTime='28 Feb 2013 23:59:59' 

Select 
      Case 
        When 
        (
         Select TOP 1 f1.UpdatedOn 
         From TicketTypeFollowUp As f1 with(nolock) 
         Where f1.UpdatedOn<T.UpdatedOn And f1.Ticket=T.Ticket 
         Order By f1.UpdatedOn Desc 
       )IS Null 
        Then Ticket.TicketRaisedOn 

        Else 
        (
         Select TOP 1 f1.UpdatedOn 
         From TicketTypeFollowUp As f1 with(nolock) 
         Where f1.UpdatedOn<T.UpdatedOn And f1.Ticket=T.Ticket 
         Order By f1.UpdatedOn Desc 
       ) End [Start Date] 

     From dbo.TicketTypeFollowUp T with(nolock) 
     --Some Tables Omitted   
     Where CAST(TicketRaisedOn As Date)Between ''+Convert(VarChar(19), @From, 100)+''  And ''+Convert(VarChar(19), @To, 100)+'' 

如果列[Start Date]具有值大於@To然後@To值應打印否則[開始日期]列

我怎樣才能把它寫在相同的查詢?

我想什麼

 Case When(
      Case 
        When 
        (
         Select TOP 1 f1.UpdatedOn 
         From TicketTypeFollowUp As f1 with(nolock) 
         Where f1.UpdatedOn<T.UpdatedOn And f1.Ticket=T.Ticket 
         Order By f1.UpdatedOn Desc 
       )IS Null 
        Then Ticket.TicketRaisedOn 

        Else 
        (
         Select TOP 1 f1.UpdatedOn 
         From TicketTypeFollowUp As f1 with(nolock) 
         Where f1.UpdatedOn<T.UpdatedOn And f1.Ticket=T.Ticket 
         Order By f1.UpdatedOn Desc 
       ) End [Start Date] 
      )> @To Then @To Else [Start Date] End, 

DB:SQL SERVER 2008

+1

你在修改上面提到的查詢方式時得到的錯誤是什麼? – 2013-05-09 12:06:08

+0

乍一看,您嵌套'CASE-END'查詢看起來很合理。它出什麼問題了?你有任何錯誤?你的結果與你期望看到的不同嗎? – 2013-05-09 12:46:17

回答

2

它看起來對我來說,你需要這樣的:

Declare  @From  DateTime='01 Feb 2013' 
Declare  @To   DateTime='28 Feb 2013 23:59:59' 

Select CASE WHEN ISNULL(StartDates.[Start Date], Ticket.TicketRaisedOn) > @To THEN @To ELSE ISNULL(StartDates.[Start Date], Ticket.TicketRaisedOn) END AS ResultValue 
From dbo.TicketTypeFollowUp T with(nolock) 
    --Some Tables Omitted 
    OUTER APPLY 
    (
     Select TOP 1 f1.UpdatedOn AS [Start Date] 
     From TicketTypeFollowUp As f1 with(nolock) 
     Where f1.UpdatedOn<T.UpdatedOn And f1.Ticket=T.Ticket 
     Order By f1.UpdatedOn Desc 
    ) StartDates 
Where CAST(TicketRaisedOn As Date)Between ''+Convert(VarChar(19), @From, 100)+''  And ''+Convert(VarChar(19), @To, 100)+'' 

外應用用於指定每行一個計算值,從上面的連接表中引用值,但在那之後它就像來自JOIN的數據。所以你給你的APPLY一個別名,就像它是一個表一樣,然後根據需要多次訪問它的值。

正如你所看到的,這大大簡化了您的query--適用是非常方便的在你的工具帶。)))

編輯新增根據註釋另一ISNULL。

+0

在外部應用...情況下,否則結束條件來吧?因爲我在我的選擇查詢中有相同的... – Shaggy 2013-05-10 09:30:16

+0

U忽略那一個 – Shaggy 2013-05-10 09:30:38

+0

這應該由外部查詢中的CASE中的ISNULL來處理,如果它不是NULL,它將使用第一個值,否則第二個值。經過反思,你也可能在ELSE塊中需要它。我會編輯我的答案。 – 2013-05-10 11:37:20