2017-07-12 94 views
0

我有以下查詢。MSSQL案例Where子句

SELECT DISTINCT datepart(day, eventdetails_datetime) as dates , bu_events.event_daysbeforeType 
FROM "bu_events" 

INNER JOIN "bu_eventdetails" ON "bu_eventdetails"."event_id" = "bu_events"."event_id" 

WHERE "bu_events"."is_active" = 1 
AND "bu_events"."is_deleted" =0 
AND "bu_eventdetails"."is_active" = 1 
AND "bu_eventdetails"."is_deleted" =0 
AND "bu_events"."service_id" = '31' 
AND (DATEDIFF(Minute, BU_EventDetails.eventDetails_datetime, '2017-07-12 10:33:19') <=0 or coalesce(event_always_available,0) = 1) 
AND 

(DATEDIFF(d, '2017-07-12 10:33:19',BU_EventDetails.eventDetails_datetime) >= coalesce(BU_Events.event_daysbefore, 0) or coalesce(event_always_available,0) = 1) 


AND (select max(availabletable_amount) 
    from bu_availabletable 
    inner join bu_eventdetails on bu_eventdetails.eventdetail_id = bu_availabletable.eventdetail_id 
    inner join bu_eventpricegroups on bu_eventpricegroups.event_id = bu_eventdetails.event_id 
    where bu_availabletable.eventdetail_id = bu_eventdetails.eventdetail_id 
    and bu_eventpricegroups.eventpricegroup_always_available = 0) > 0 
    AND datepart(Month,eventdetails_datetime) = 07 
    AND datediff(d,getdate(),eventdetails_datetime)>=0 

我想要做的,就是如果bu_events.event_daysbeforeType是1,那麼(DATEDIFF(d, '2017-07-12 10:33:19',BU_EventDetails.eventDetails_datetime) >= coalesce(BU_Events.event_daysbefore, 0) or coalesce(event_always_available,0) = 1),如果它是2,那麼(DATEDIFF(hour, '2017-07-12 10:33:19',BU_EventDetails.eventDetails_datetime) >= coalesce(BU_Events.event_daysbefore, 0) or coalesce(event_always_available,0) = 1)

所以根據bu_events.event_daysbeforeType我想DATEDIFF與d或一小時。

是我到目前爲止已經試過,但沒有工作是這樣的:

SELECT DISTINCT datepart(day, eventdetails_datetime) as dates , bu_events.event_daysbeforeType 
FROM "bu_events" 

INNER JOIN "bu_eventdetails" ON "bu_eventdetails"."event_id" = "bu_events"."event_id" 

WHERE "bu_events"."is_active" = 1 
AND "bu_events"."is_deleted" =0 
AND "bu_eventdetails"."is_active" = 1 
AND "bu_eventdetails"."is_deleted" =0 
AND "bu_events"."service_id" = '31' 
AND (DATEDIFF(Minute, BU_EventDetails.eventDetails_datetime, '2017-07-12 10:33:19') <=0 or coalesce(event_always_available,0) = 1) 
AND 

CASE 
WHEN bu_events.event_daysbeforeType = 1 THEN 
(DATEDIFF(d, '2017-07-12 10:33:19',BU_EventDetails.eventDetails_datetime) >= coalesce(BU_Events.event_daysbefore, 0) or coalesce(event_always_available,0) = 1) 
ELSE 
(DATEDIFF(hour, '2017-07-12 10:33:19',BU_EventDetails.eventDetails_datetime) >= coalesce(BU_Events.event_daysbefore, 0) or coalesce(event_always_available,0) = 1) 
END 

AND (select max(availabletable_amount) 
    from bu_availabletable 
    inner join bu_eventdetails on bu_eventdetails.eventdetail_id = bu_availabletable.eventdetail_id 
    inner join bu_eventpricegroups on bu_eventpricegroups.event_id = bu_eventdetails.event_id 
    where bu_availabletable.eventdetail_id = bu_eventdetails.eventdetail_id 
    and bu_eventpricegroups.eventpricegroup_always_available = 0) > 0 
    AND datepart(Month,eventdetails_datetime) = 07 
    AND datediff(d,getdate(),eventdetails_datetime)>=0 

任何想法我做錯了嗎?

回答

2

你不能像這樣使用這種情況。 case是一個表達式,並且您嘗試將其用作流控制。
從MSDN:

的情況下表達不能被用來控制Transact-SQL語句,語句塊用戶定義的函數,和存儲過程的執行流程。有關流控制方法的列表,請參閱流控制語言(Transact-SQL)。

代替使用箱子,這樣做:

AND 
(
    (
     bu_events.event_daysbeforeType = 1 
     AND (DATEDIFF(d, '2017-07-12 10:33:19',BU_EventDetails.eventDetails_datetime) >= coalesce(BU_Events.event_daysbefore, 0) or coalesce(event_always_available,0) = 1) 
    ) 
    OR 
    (
     bu_events.event_daysbeforeType <> 1 
     AND (DATEDIFF(hour, '2017-07-12 10:33:19',BU_EventDetails.eventDetails_datetime) >= coalesce(BU_Events.event_daysbefore, 0) or coalesce(event_always_available,0) = 1) 
    ) 

) 
+0

非常感謝您,即使@Serg回答了案例解決方案,爲簡單起見,我認爲使用您的方式是我接受的答案。 –

0

CASE是計算值,並作爲SQL沒有邏輯(布爾)值不應該用邏輯表達式,但所計算的混淆值是邏輯表達式的有效參數。嘗試

AND (CASE WHEN bu_events.event_daysbeforeType = 1 
     THEN (DATEDIFF(d, '2017-07-12 10:33:19',BU_EventDetails.eventDetails_datetime) 
     ELSE DATEDIFF(hour, '2017-07-12 10:33:19',BU_EventDetails.eventDetails_datetime) 
    END >= coalesce(BU_Events.event_daysbefore, 0) or coalesce(event_always_available,0) = 1 
)