简体   繁体   English

CASE WHEN中条件表达的别名

[英]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. 我尝试使用WITH选择在CASE WHEN中使用的事件时间,但没有成功。 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 注意:此解决方案适用于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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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