Заменить возвращаемое значение в операторе выбора SQL - PullRequest
0 голосов
/ 31 октября 2019

Я пытался заменить значения в столбце возвращаемых данных из запроса SQL.

После долгого поиска в Google я попытался использовать REPLACE и CASE, но безуспешно, поэтому я немного помог с ним.

Столбец, которым я хочу манипулировать, это ParentMsgClassID. Поэтому в небольшом простом псевдокоде я хочу, чтобы произошло следующее:

IF ParentMsgClassID = 1000 VALUE = Audit
IF ParentMsgClassID = 2000 VALUE = Security
IF ParentMsgClassID = 3000 VALUE = Operations

Мой оператор Select выглядит следующим образом.

select
/*MsgSourceType Columns*/
ST.MsgSourceTypeID,
ST.[Name] AS MsgSourceTypeName,

/*MPERuleToMsgSourceType Columns*/
MRMST.MPERuleRegexID,

/*MPERule Columns*/
MPER.MPERuleID,
MPER.CommonEventID,
MPER.FullName AS MPERuleFullName,
MPER.BaseRule,

/*Common Event Columns*/
CE.MsgClassID,
CE.[Name] AS commonEventName,

/*MsgClass Columns*/
MC.ParentMsgClassID,
MC.[Name] AS MsgClassName,
MC.FullName AS MsgClassFullName,
MC.ShortDesc AS MsgShortDesc

from MsgSourceType AS ST

inner join MPERuleToMsgSourceType AS MRMST on ST.MsgSourceTypeID = MRMST.MsgSourceTypeID
inner join MPERule AS MPER on MPER.MPERuleRegexID = MRMST.MPERuleRegexID
inner join CommonEvent AS CE on MPER.CommonEventID = CE.CommonEventID
inner join MsgClass as MC on CE.MsgClassID =  MC.MsgClassID

where ST.[Name] like 'syslog - Palo Alto Firewall';

Любая помощь будет в значительной степени получена, также я 'Я не администратор баз данных, поэтому все вышеперечисленное просто объединено и может быть неоптимальным.

Согласно комментарию ниже, я пытался использовать CASE, но это не сработало. Я включил запрос для справки.

select

/*MsgSourceType Columns*/
ST.MsgSourceTypeID,
ST.[Name] AS MsgSourceTypeName,

/*MPERuleToMsgSourceType Columns*/
MRMST.MPERuleRegexID,

/*MPERule Columns*/
MPER.MPERuleID,
MPER.CommonEventID,
MPER.FullName AS MPERuleFullName,
MPER.BaseRule,

/*Common Event Columns*/
CE.MsgClassID,
CE.[Name] AS commonEventName,

/*MsgClass Columns*/
MC.ParentMsgClassID,
MC.[Name] AS MsgClassName,
MC.FullName AS MsgClassFullName,
MC.ShortDesc AS MsgShortDesc,

CASE MC.ParentMsgClassID
    WHEN 1000 THEN 'Audit'
    WHEN 2000 THEN 'Security'
    WHEN 3000 THEN 'Operations'
END AS ParentMsgClassText

from MsgSourceType AS ST

inner join MPERuleToMsgSourceType AS MRMST on ST.MsgSourceTypeID = MRMST.MsgSourceTypeID
inner join MPERule AS MPER on MPER.MPERuleRegexID = MRMST.MPERuleRegexID
inner join CommonEvent AS CE on MPER.CommonEventID = CE.CommonEventID
inner join MsgClass as MC on CE.MsgClassID =  MC.MsgClassID

where ST.[Name] like 'syslog - Palo Alto Firewall';

Ответы [ 3 ]

1 голос
/ 31 октября 2019

Кажется, что простое выражение CASE делает то, что вам нужно:

SELECT
    ...
    CASE MC.ParentMsgClassID WHEN 1000 THEN 'Audit'
                             WHEN 2000 THEN 'Security'
                             WHEN 3000 THEN 'Operations' END AS ParentMsgClassText

Это можно просто добавить к вашему текущему выражению SELECT из того, что я вижу.

Если вы хотите, чтобы эти метки логически становились частью самой таблицы, то вы либо обновите с новым столбцом, либо, возможно, просто добавите вычисляемый столбец. Для последнего варианта:

ALTER TABLE MsgClass
ADD ParentMsgClassText AS (
    CASE MC.ParentMsgClassID WHEN 1000 THEN 'Audit'
                             WHEN 2000 THEN 'Security'
                             WHEN 3000 THEN 'Operations' END);
0 голосов
/ 31 октября 2019

Этот ответ был получен из комбинации ответов, которые у меня были на этот вопрос от @Tim Biegeleisen & @ FarhadRahmanifard

Тим был абсолютно прав, говоря, что использование оператора CASE может достичь того, чего я хотел. Однако моя реализация была неверной, см. Правку в моем исходном посте выше.

В чем помог Фархад, попросив меня изолировать то, что я хотел сделать, от остальной части запроса. Как только мы это сделали, мне пришло в голову поместить оператор CASE сразу после столбца, которым я хотел манипулировать.

Рабочий код приведен ниже для справки.

select

    /*MsgSourceType Columns*/
    ST.MsgSourceTypeID,
    ST.[Name] AS MsgSourceTypeName,

    /*MPERuleToMsgSourceType Columns*/
    MRMST.MPERuleRegexID,

    /*MPERule Columns*/
    MPER.MPERuleID,
    MPER.CommonEventID,
    MPER.FullName AS MPERuleFullName,
    MPER.BaseRule,

    /*Common Event Columns*/
    CE.MsgClassID,
    CE.[Name] AS commonEventName,

    /*MsgClass Columns*/
    MC.ParentMsgClassID,

    CASE MC.ParentMsgClassID
        WHEN 1000 THEN 'Audit'
        WHEN 2000 THEN 'Security'
        ELSE 'Operations'
    END AS ParentMsgClassText,

    MC.[Name] AS MsgClassName,
    MC.FullName AS MsgClassFullName,
    MC.ShortDesc AS MsgShortDesc

from MsgSourceType AS ST

inner join MPERuleToMsgSourceType AS MRMST on ST.MsgSourceTypeID = MRMST.MsgSourceTypeID
inner join MPERule AS MPER on MPER.MPERuleRegexID = MRMST.MPERuleRegexID
inner join CommonEvent AS CE on MPER.CommonEventID = CE.CommonEventID
inner join MsgClass as MC on CE.MsgClassID =  MC.MsgClassID

where ST.[Name] like 'syslog - Palo Alto Firewall';
0 голосов
/ 31 октября 2019

Вы можете сделать это с делом, как показал Тим в другом ответе, вы также можете использовать соединение с существующей таблицей (таблицей сопоставления) или таблицей, которую вы составляете на месте. Подумайте, есть ли у вас другая таблица с именем map, которая выглядит следующим образом:

Key  Value
1000 'Audit'
2000 'Security'
3000 'Operations'

Затем вы можете изменить свой SQL, добавив следующие строки:

 SELECT
   -- all existing stuff
   MAP.VALUE as ParentMsgClassText
 FROM -- as exists
 JOIN MAP ON MAP.Key = ParentMsgClassID

Вы также можете «сделать»сопоставьте на месте вот так:

 SELECT
   -- all existing stuff
   MAP.VALUE as ParentMsgClassText
 FROM -- as exists
 JOIN (
   VALUES
     (1000, 'Audit'),
     (2000, 'Security'),
     (3000, 'Operations')
 ) AS MAP(Key,Value) ON MAP.Key = ParentMsgClassID

Лично я предпочитаю этот способ использования CASE - многие продукты SQL будут работать быстрее, и если вы создадите внешнюю таблицу, ее будет проще поддерживать - вы можете изменитьтаблица для изменения поиска без необходимости изменения кода SQL.

...