簡體   English   中英

將 case 語句放入 max() function 和 where 語句

[英]Putting a case statement in max() function and where statement


我有這個案例語句,我將修改后的 stop_time 列作為 Stop_TimeNEW

select 
        case
            when Stop_Time is null then sysdate
            else Stop_Time
        end as Stop_TimeNEW
from TEMPTABLE;

我想在這個 select 語句中使用那個 Stop_TimeNEW 值,只要它說“Stop_Time”。

Select sum(minutes)
 From (
        Select Distinct 
               B.DateR1
              ,B.DateR2
              , (((extract(DAY FROM DateR2-DateR1)*24*60*60)+ 
                (extract(HOUR FROM DateR2-DateR1)*60*60)+
                (extract(MINUTE FROM DateR2-DateR1)*60)+
                extract(SECOND FROM DateR2-DateR1)))/60 as minutes
         From TempTable A
         Cross Apply (
                      Select
                            Min(Start_Time) as DateR1
                            ,max(Stop_Time) as DateR2
                       From  TempTable 
                       Where Start_Time <= A.Stop_Time and Stop_Time >= A.Start_Time 
                     ) B
 ) A

我試過這樣做,但沒有奏效

Select sum(minutes)
 From (
        Select Distinct 
               B.DateR1
              ,B.DateR2
              , (((extract(DAY FROM DateR2-DateR1)*24*60*60)+ 
                (extract(HOUR FROM DateR2-DateR1)*60*60)+
                (extract(MINUTE FROM DateR2-DateR1)*60)+
                extract(SECOND FROM DateR2-DateR1)))/60 as minutes
         From TempTable A
         Cross Apply (
                      Select
                            case
                                when Stop_Time is null then sysdate
                                else Stop_Time
                             end as Stop_TimeNEW,
                            Min(Start_Time) as DateR1
                            ,max(Stop_TimeNEW) as DateR2
                       From  TempTable 
                       Where Start_Time <= A.Stop_TimeNEW and Stop_TimeNEW >= A.Start_Time 
                     ) B
 ) A

Cross Apply (
                      Select
                            case
                                when Stop_Time is null then sysdate
                                else Stop_Time
                             end as Stop_TimeNEW,
                            Min(Start_Time) as DateR1
                            ,max(case
                                when Stop_Time is null then sysdate
                                else Stop_Time
                             end as Stop_TimeNEW) as DateR2
                       From  TempTable 
                       Where Start_Time <= (select case
                                when Stop_Time is null then sysdate
                                else Stop_Time
                             end as Stop_TimeNEW from a) and (select case
                                when Stop_Time is null then sysdate
                                else Stop_Time
                             end as Stop_TimeNEW from temptable) >= A.Start_Time 
                     ) B

想知道是否有人可以提供幫助?

您可能需要一個 NVL function(它處理 null 值)。 試試下面的查詢 -

Select sum(minutes)
 From (
        Select Distinct 
               B.DateR1
              ,B.DateR2
              , (((extract(DAY FROM DateR2-DateR1)*24*60*60)+ 
                (extract(HOUR FROM DateR2-DateR1)*60*60)+
                (extract(MINUTE FROM DateR2-DateR1)*60)+
                extract(SECOND FROM DateR2-DateR1)))/60 as minutes
         From TempTable A
         Cross Apply (
                      Select
                            Min(Start_Time) as DateR1
                            ,MAX(NVL(Stop_Time, sysdate)) as DateR2
                       From  TempTable 
                       Where Start_Time <= A.Stop_Time and Stop_Time >= A.Start_Time 
                     ) B
 ) A

首先

**選擇

案例當 Stop_Time 是 null 然后是 sysdate

否則 Stop_Time

以 Stop_TimeNEW 結尾,......來自 TempTable

其中 Start_Time <= A.Stop_TimeNEW 和 Stop_TimeNEW >= A.Start_Time**

將不起作用,因為在 SELECT 和 AS 之前執行“Where”子句的執行順序,這意味着在您的代碼中執行 WHERE 時,它甚至不知道 Stop_TimeNEW 已創建。 我建議你可以使用子查詢來做同樣的事情

SELECT Stop_TimeNEW,Min(Start_Time) as DateR1,max(Stop_TimeNEW) as DateR2 FROM (Select A.*, CASE WHEN Stop_Time is null then sysdate ELSE Stop_Time END AS Stop_TimeNEW From TempTable A) Where Start_Time <= A.Stop_TimeNEW and Stop_TimeNEW >= A.Start_Time

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM