Есть ли простой способ (синтаксис), чтобы написать вложенную инструкцию case, чтобы понять это? - PullRequest
0 голосов
/ 18 апреля 2019

Есть ли особый синтаксис для написания вложенного оператора case? У меня есть хранимая процедура, в которой мне нужно выяснить, что происходит, и подумал, может быть, есть более простой способ понять вложенный оператор case?

SELECT
       CASE 
            WHEN ISNULL(NetRate_Quote_Insur_Quote_Locat.[Transaction], '') <> '' AND NetRate_Quote_Insur_Quote_Locat.EndorsementNumber = NetRate_Quote_Insur_Quote.EndorsementNumber
            THEN 
                CASE 
                    NetRate_Quote_Insur_Quote_Locat.[Transaction]
                        WHEN 'ADD' THEN 'Add'
                        WHEN 'DELETED' THEN 'Delete'
                        WHEN 'CHANGED' THEN 'Change'
                        WHEN 'New Quote' THEN 'Add'
                    ELSE 
                        CASE 
                            WHEN tblQuotes.OriginalQuoteGuid IS NULL OR NetRate_Quote_Insur_Quote.TypeofBusiness = 'Reinstate'
                            THEN 'Add'
                            ELSE 
                                CASE WHEN tblQuotes.QuoteStatusID = 12 
                                THEN 'Delete' 
                                ELSE 'No Change' 
                            END
                     END
                 END
                 ELSE 
                 CASE WHEN tblQuotes.OriginalQuoteGuid IS NULL OR NetRate_Quote_Insur_Quote.TypeofBusiness = 'Reinstate'
                 THEN 'Add'
                 ELSE 
                    CASE 
                        WHEN tblQuotes.QuoteStatusID = 12 
                        THEN 'Delete' 
                        ELSE 'No Change' 
                    END
                  END
               END as TransactionName


        FROM  

Ответы [ 5 ]

1 голос
/ 18 апреля 2019

Лично я бы написал это так:

select
    case
    when isNull(NetRate_Quote_Insur_Quote_Locat.[Transaction], '') <> ''
            and NetRate_Quote_Insur_Quote_Locat.EndorsementNumber
              = NetRate_Quote_Insur_Quote.EndorsementNumber
    then
        case NetRate_Quote_Insur_Quote_Locat.[Transaction]
        when 'ADD'          then 'Add'
        when 'DELETED'      then 'Delete'
        when 'CHANGED'      then 'Change'
        when 'New Quote'    then 'Add'
        else
            case
            when tblQuotes.OriginalQuoteGuid is null
                or NetRate_Quote_Insur_Quote.TypeofBusiness = 'Reinstate'
            then 'Add'
            else
                case
                when tblQuotes.QuoteStatusID = 12
                then 'Delete'
                else 'No Change'
                end
            end
        end
    else
        case
        when tblQuotes.OriginalQuoteGuid is null
            or NetRate_Quote_Insur_Quote.TypeofBusiness = 'Reinstate'
        then 'Add'
        else
            case
            when tblQuotes.QuoteStatusID = 12
            then 'Delete'
            else 'No Change'
            end
        end
    end as TransactionName
from ...

Но я бы удалил несколько дел:

select
    case
    when isNull(NetRate_Quote_Insur_Quote_Locat.[Transaction], '')
                in ('ADD','DELETE','CHANGED','New Quote')
            and NetRate_Quote_Insur_Quote_Locat.EndorsementNumber
              = NetRate_Quote_Insur_Quote.EndorsementNumber
    then
        case NetRate_Quote_Insur_Quote_Locat.[Transaction]
        when 'ADD'          then 'Add'
        when 'DELETED'      then 'Delete'
        when 'CHANGED'      then 'Change'
        when 'New Quote'    then 'Add'
        end
    else
        case
        when tblQuotes.OriginalQuoteGuid is null
            or NetRate_Quote_Insur_Quote.TypeofBusiness = 'Reinstate'
        then 'Add'
        else
            case
            when tblQuotes.QuoteStatusID = 12
            then 'Delete'
            else 'No Change'
            end
        end
    end as TransactionName
from ...
0 голосов
/ 18 апреля 2019

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

Как правило, у вас есть много предложений ELSE CASE xxx, где второй случай можно просто добавить как дополнительные предложения WHEN к исходному случаю, особенно если вы не используете CASE value и заменяете его синтаксисом CASE WHEN value=.

Это то, что я думаю, все решает в:

CASE 
    WHEN NetRate_Quote_Insur_Quote_Locat.[Transaction]='ADD' THEN 'Add'
    WHEN NetRate_Quote_Insur_Quote_Locat.[Transaction]='DELETED' THEN 'Delete'
    WHEN NetRate_Quote_Insur_Quote_Locat.[Transaction]='CHANGED' THEN 'Change'
    WHEN NetRate_Quote_Insur_Quote_Locat.[Transaction]='New Quote' THEN 'Add'
    WHEN tblQuotes.OriginalQuoteGuid IS NULL OR NetRate_Quote_Insur_Quote.TypeofBusiness = 'Reinstate' THEN 'Add'
    WHEN tblQuotes.QuoteStatusID = 12 THEN 'Delete' 
    ELSE 'No Change' 
END as TransactionName
0 голосов
/ 18 апреля 2019

Когда имена таблиц или столбцов делают вещи очень горизонтальными, я использую псевдонимы. Таким образом, в ваших утверждениях from и join я бы присваивал псевдоним NetRate_Quote_insur_quote как «nQuote», а «NetRate_Quote_insur_quote_locat» - как «loc».

Кроме того, для вещей, которые занимают более одной строки, мне нравится синтаксис colName = xyz.

Кроме того, мне нравятся слова 'case', выровненные с операторами 'when', 'else' и 'end', и, если возможно, операторы 'then', не соответствующие этим остальным.

Так бы это выглядело так:

select  TransactionName = 
            CASE 
            WHEN ISNULL(loc.[Transaction], '') <> '' AND loc.EndorsementNumber = nQuote.EndorsementNumber THEN 
                CASE loc.[Transaction]
                WHEN 'ADD' THEN 'Add'
                WHEN 'DELETED' THEN 'Delete'
                WHEN 'CHANGED' THEN 'Change'
                WHEN 'New Quote' THEN 'Add'
                ELSE 
                    CASE 
                    WHEN tblQuotes.OriginalQuoteGuid IS NULL OR nQuote.TypeofBusiness = 'Reinstate' THEN 'Add'
                    ELSE 
                        CASE WHEN tblQuotes.QuoteStatusID = 12 THEN 'Delete' 
                        ELSE 'No Change' 
                        END
                    END
                END
            ELSE 
                CASE 
                WHEN tblQuotes.OriginalQuoteGuid IS NULL OR nQuote.TypeofBusiness = 'Reinstate' THEN 'Add'
                ELSE 
                    CASE 
                    WHEN tblQuotes.QuoteStatusID = 12 THEN 'Delete' 
                    ELSE 'No Change' 
                    END
                END
            END 

Кроме того, я часто нахожу полезным использовать повторяющуюся логику в выражениях перекрестного применения. Так что если после ваших операторов объединения вы можете добавить что-то вроде:

cross apply (select 
    endorsed = 
        case 
        when ISNULL(loc.[Transaction], '') <> '' AND loc.EndorsementNumber = nQuote.EndorsementNumber then 1
        else 0 
        end,
    nullOrReinstate = 
        case 
        when tblQuotes.OriginalQuoteGuid IS NULL OR nQuote.TypeofBusiness = 'Reinstate' then 1
        else 0
        end
) ap

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

select  TransactionName = 
            CASE 
            WHEN endorsed = 1 and loc.[Transaction] in ('add', 'deleted', 'changed') then loc.[transaction]
            WHEN endorsed = 1 and loc.[transaction] = 'New Quote' THEN 'Add'
            WHEN endorsed = 1 and nullOrReinstate = 1 THEN 'Add'
            WHEN endorsed = 1 and tblQuotes.QuoteStatusID = 12 THEN 'Delete' 
            WHEN nullOrReinstate = 1 THEN 'Add'
            WHEN tblQuotes.QuoteStatusID = 12 THEN 'Delete' 
            ELSE 'No Change' 
            END 
0 голосов
/ 18 апреля 2019

Этот вариант выравнивает логику CASE WHEN tblQuotes.QuoteStatusID = 12 в окружении case для обоих вхождений, поскольку нет смысла вкладывать выражения поиска выражения:

case
  when IsNull( NetRate_Quote_Insur_Quote_Locat.[Transaction], '' ) <> '' and
    NetRate_Quote_Insur_Quote_Locat.EndorsementNumber = NetRate_Quote_Insur_Quote.EndorsementNumber
    then
      case NetRate_Quote_Insur_Quote_Locat.[Transaction]
        when 'ADD'       then 'Add'
        when 'DELETED'   then 'Delete'
        when 'CHANGED'   then 'Change'
        when 'New Quote' then 'Add'
        else
          case
            when tblQuotes.OriginalQuoteGuid is NULL or NetRate_Quote_Insur_Quote.TypeofBusiness = 'Reinstate'
              then 'Add'
            when tblQuotes.QuoteStatusID = 12 then 'Delete'
            else 'No Change' 
            end
        end
  else
    case
      when tblQuotes.OriginalQuoteGuid is NULL or NetRate_Quote_Insur_Quote.TypeofBusiness = 'Reinstate'
        then 'Add'
      when tblQuotes.QuoteStatusID = 12 then 'Delete' 
      else 'No Change' 
      end
    end as TransactionName

Если NetRate_Quote_Insur_Quote_Locat.[Transaction] может иметь только перечисленные значения ('ADD', 'DELETED', 'CHANGED' и 'New Quote'), тогда любое другое значение приведет к NULL результату в отсутствие предложения else.Вы можете использовать это с coalesce, чтобы свернуть большой блок повторяющегося кода:

Coalesce(
  case
    when IsNull( NetRate_Quote_Insur_Quote_Locat.[Transaction], '' ) <> '' and
      NetRate_Quote_Insur_Quote_Locat.EndorsementNumber = NetRate_Quote_Insur_Quote.EndorsementNumber
      then
        case NetRate_Quote_Insur_Quote_Locat.[Transaction]
          when 'ADD'       then 'Add'
          when 'DELETED'   then 'Delete'
          when 'CHANGED'   then 'Change'
          when 'New Quote' then 'Add'
          end,
  case
    when tblQuotes.OriginalQuoteGuid is NULL or NetRate_Quote_Insur_Quote.TypeofBusiness = 'Reinstate'
      then 'Add'
    when tblQuotes.QuoteStatusID = 12 then 'Delete' 
    else 'No Change' 
    end ) as TransactionName
0 голосов
/ 18 апреля 2019

Я могу сэкономить вам несколько строк

    case NetRate_Quote_Insur_Quote_Locat.[Transaction]
    when 'ADD'          then 'Add'
    when 'DELETED'      then 'Delete'
    when 'CHANGED'      then 'Change'

Может стать

    case when NetRate_Quote_Insur_Quote_Locat.[Transaction] in ('ADD', 'DELETED', 'CHANGED') then LEFT(NetRate_Quote_Insur_Quote_Locat.[Transaction], 6)
...