Попробуйте: 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
, и возвращается полная строка.