简体   繁体   中英

Alias for conditional expression in CASE WHEN

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 ??

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;

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM