条件子串

时间:2018-05-30 09:13:52

标签: sql if-statement count substring conditional-statements

我有一张类似于:

的表格
--- 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 :(得分:0)

试试这个: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)。在这里,我们将完整描述的长度和描述的长度之间的差异与删除的代码的所有实例一起获得表示删除的字符数的值。然后,我们将其除以代码中的字符数,以获取删除的代码数。例如如果我们有一个包含2个3字符代码实例的12个字符的字符串,那么我们将(12 - 6) / 3给我们2。包含nullif,以便如果代码以某种方式为0(如果ErrorDescr为空,或者如果修改了捕获错误代码的代码,则可能),我们将避免分割0错误,而是说计数是如果没有要计算的代码,则为null。

更新

如果在代码不以E开头时获取10个字符,您可以修改您的案例陈述: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(也会匹配这些值)不会被击中;但是那些没有E代码的Error:开始的值会落到第二个,并在此处理,取10个字符。任何匹配都不会落入else语句并返回完整字符串。