Reputation: 51
I have a situation in which I use same condition checked multiple times using case when, query is as follows
SELECT wcrus_status.emucarid,
CASE
WHEN (((wcrus_status.healthstatus = -1)
AND (
(SELECT eventtime
FROM wcru_latestevents
WHERE wcrus_status.emucarid = wcru_latestevents.emucarid
AND wcru_latestevents.eventuei = 'uei.opennms.org/rfnet-WCRU/ntpSyncTrap') > wcrus_status.startuptime))
OR ((wcrus_status.healthstatus <> -1)
AND (
(SELECT eventtime
FROM wcru_latestevents
WHERE wcrus_status.emucarid = wcru_latestevents.emucarid
AND wcru_latestevents.eventuei = 'uei.opennms.org/rfnet-WCRU/ntpSyncTrap') > wcrus_status.startuptime)
AND (
(SELECT eventtime
FROM wcru_latestevents
WHERE wcrus_status.emucarid = wcru_latestevents.emucarid
AND wcru_latestevents.eventuei = 'uei.opennms.org/rfnet-WCRU/ntpSyncTrap') > wcrus_status.posttime))) THEN ()
ELSE wcrus_status.ntp
END AS ntp
FROM wcrus_status
I tried WITH to select the eventtime to use in CASE WHEN, but no success. Could some one point me how to optimize this query with out duplicating the same subquery multiple times ??
Upvotes: 1
Views: 133
Reputation:
Something along the lines:
with data as (
SELECT wcrus_status.emucarid,
wcrus_status.healthstatus,
wcrus_status.startuptime,
wcrus_status.posttime,
wcrus_status.ntp,
(SELECT eventtime
FROM wcru_latestevents
WHERE wcrus_status.emucarid = wcru_latestevents.emucarid
AND wcru_latestevents.eventuei = 'uei.opennms.org/rfnet-WCRU/ntpSyncTrap') as eventtime
FROM wcrus_status
)
select emucarid,
case
when (((healthstatus = -1 AND eventtime > startuptime) OR healthstatus <> -1 AND eventtime > wcrus_status.startuptime) AND ....
ELSE ntp
END AS ntp
from data;
Upvotes: 2
Reputation: 2655
Note: This solution is for MSSQL
What about this..
Declare @date as date
SELECT @date = eventtime
FROM wcru_latestevents
WHERE wcrus_status.emucarid = wcru_latestevents.emucarid
AND wcru_latestevents.eventuei = 'uei.opennms.org/rfnet-WCRU/ntpSyncTrap'
SELECT wcrus_status.emucarid,
CASE
WHEN (((wcrus_status.healthstatus = -1)
AND (
@date > wcrus_status.startuptime))
OR ((wcrus_status.healthstatus <> -1)
AND (
@date > wcrus_status.startuptime)
AND (
@date > wcrus_status.posttime))) THEN ()
ELSE wcrus_status.ntp
END AS ntp
FROM wcrus_status
Upvotes: 0