Условная подстрока - PullRequest
0 голосов
/ 30 мая 2018

У меня есть таблица, похожая на:

--- ID ----  ErrorDescr ---
    1        Error: ERROR1 - ESK - motor problem
    1        Error: ERROR13 - EPN - window problem
    1        Human problem 

Что я хочу:

--ID--ErrorType---Count
  1   ESK            1
  1   EPN            1
  1   Human problem  1

, если «ErrorDescr» начинается с «Ошибка: ... я хочу подстроку после»- "и получить код ошибки из 3 символов, но если ошибки нет: ... Я просто беру текст .... и считаю экземпляры этого текста ...

Кто-нибудь?

1 Ответ

0 голосов
/ 30 мая 2018

Попробуйте: SQL Fiddle

select Id
, ErrorType
, (len(ErrorDescr) - len(replace(ErrorDescr, ErrorType, '')))/nullif(len(ErrorType),0) Count
from 
(
    select Id
    , ErrorDescr
    , case 
        when ErrorDescr like 'Error:%- E__ -%' then
            substring(ErrorDescr, charindex('-',ErrorDescr)+2, 3)
        else 
            ErrorDescr
     end ErrorType
     from Error
 ) subQuery

Что происходит?

  • Оператор case позволяет нам выбрать подходящийлогика для обработки этих строк, начинающихся Error: против тех, которые этого не делают.Я использовал выражение ErrorDescr like 'Error:%- E__ -%', чтобы гарантировать, что наряду с началом Error: строка также должна содержать дефис, за которым следует пробел, затем 3-символьный код, начинающийся с E перед другим пробелом и дефисом, затем что угодно.

  • Чтобы получить подстроку, мы просто используем функцию substring: substring(ErrorDescr, charindex('-',ErrorDescr)+2, 3).Мы находим позицию первого дефиса, затем перемещаемся вперед на два места, чтобы найти пробел, затем на E (первый символ нашего 3-символьного кода).Начиная с этого символа (E) мы берем 3 символа, получая наш полный код.

  • Мы помещаем это в подзапрос, чтобы наш код был доступен нам во внешнем запросе, а ненам нужно пересчитать это значение для расчета количества.Код для подсчета вхождений кода в описании: (len(ErrorDescr) - len(replace(ErrorDescr, ErrorType, '')))/nullif(len(ErrorType),0).Здесь мы берем разницу между длиной полного описания и длиной описания со всеми удаленными экземплярами кода, чтобы получить значение, представляющее количество удаленных символов.Затем мы делим это на количество символов в коде, чтобы получить количество удаленных кодов.Например, если у нас есть строка из 12 символов, содержащая 2 экземпляра кода из 3 символов, у нас будет (12 - 6) / 3, что даст нам 2.nullif включено так, что если бы код был каким-то образом 0 (возможно, если ErrorDescr пуст или если код для захвата кода ошибки был изменен), мы бы избежали ошибки деления 0, вместо этого говоря, что счетчик равен нулю, когданет кодов для подсчета.


Обновление

Что касается взятия 10 символов, когда код не начинается с буквы E, вы можете внести поправки в свое делонапример: SQL Fiddle

, case 
   when ErrorDescr like 'Error:%- E__ -%' then
       substring(ErrorDescr, charindex('-',ErrorDescr)+2, 3)
   when ErrorDescr like 'Error:%- %' then
       substring(ErrorDescr, charindex('-',ErrorDescr)+2, 10)
   else 
       ErrorDescr
end ErrorType

т.е. сценарий, в котором код начинается с E, обрабатывается первым оператором when;поэтому для этих значений вторая when (которая также будет соответствовать этим значениям) не будет достигнута;но те значения, начинающиеся Error:, которые не имеют кода E, переходят к этому второму и обрабатываются здесь, принимая 10 символов.Любые, которые не совпадают, не попадают в оператор else, и возвращается полная строка.

...