2015-07-16 2 views
1

У меня есть таблица ниже:фильтр конкретное слово в SQL Server по номеру строки

| Row | RecordLocator | Comment  
|-----|---------------|------------------------------------------------------------------  
| 1 |  AAA111 | SearchCrt:ONEWAY - EMAIL:0:[email protected] - EMAIL:1:[email protected] - PassangerContact: xxxyy - Promo:0257 - ...... 
| 2 |  AAA111 | SearchCrt:ONEWAY - EMAIL:0:[email protected] - EMAIL:1:[email protected] - PassangerContact: xxxyy - Promo:0257 - ...... 
| 1 |  BBB111 | PassangerContact: jrte - PersonID:12 - EMAIL:0:[email protected] - BagTag: 12315 - ....... 
| 1 |  CCC111 | Promo:5474 - EMAIL:0:[email protected] - BagTag: 12315 - EMAIL:1:[email protected] - EMAIL:2:[email protected] - ....... 
| 2 |  CCC111 | Promo:5474 - EMAIL:0:[email protected] - BagTag: 12315 - EMAIL:1:[email protected] - EMAIL:2:[email protected] - ....... 
| 3 |  CCC111 | Promo:5474 - EMAIL:0:[email protected] - BagTag: 12315 - EMAIL:1:[email protected] - EMAIL:2:[email protected] - ....... 
| 1 |  DDD111 | Promo:89474 - BagTag: 147515 - dds2121sdsd1a2 - 221221gdfgf - ....... 

И мне нужен результат ниже:

| Row | RecordLocator | E-mail  
|-----|---------------|------------------------------------------------------------------  
| 1 |  AAA111 | [email protected] 
| 2 |  AAA111 | [email protected] 
| 1 |  BBB111 | [email protected] 
| 1 |  CCC111 | [email protected] 
| 2 |  CCC111 | [email protected] 
| 3 |  CCC111 | [email protected] 
| 1 |  DDD111 | not found 

EMAIL:0: необходимо добавить line 1, EMAIL:1: необходимо добавить line 2 .... Но только по электронной почте. Если не найдено по электронной почте, отправьте сообщение not found.

Я попытался ниже запрос:

SELECT DISTINCT 
      tmpRow.Row 
      , tmpRow.RecordLocator 
      , isNull(searchEmail.Email, 'not found') 
     FROM #TmpRow tmpRow 

     CROSS APPLY 
     (

      SELECT SUBSTRING (tmpRow2.Comment , (CHARINDEX('EMAIL:'+ (tmpRow2.Row - 1) +':', tmpRow2.Comment)) , 20) AS Email 
       FROM #TmpRow tmpRow2 
      WHERE tmpRow.Row = tmpRow2.Row 
       AND tmpRow.RecordLocator = tmpRow2.RecordLocator 

     )searchEmail 

Но нет успеха, мне нужно остановить в - полукокса и CHARINDEX не работает тоже.

Я использую SQL Server 2008.

ответ

2

Вот еще один способ сделать это вместе с образцами данных в КТР.

with something(RowNum, RecordLocator, Comment) as 
(
    select 1, 'AAA111', 'SearchCrt:ONEWAY - EMAIL:0:[email protected] - EMAIL:1:[email protected] - PassangerContact: xxxyy - Promo:0257 - ......' union all 
    select 2, 'AAA111', 'SearchCrt:ONEWAY - EMAIL:0:[email protected] - EMAIL:1:[email protected] - PassangerContact: xxxyy - Promo:0257 - ......' union all 
    select 1, 'BBB111', 'PassangerContact: jrte - PersonID:12 - EMAIL:0:[email protected] - BagTag: 12315 - .......' union all 
    select 1, 'CCC111', 'Promo:5474 - EMAIL:0:[email protected] - BagTag: 12315 - EMAIL:1:[email protected] - EMAIL:2:[email protected] - .......' union all 
    select 2, 'CCC111', 'Promo:5474 - EMAIL:0:[email protected] - BagTag: 12315 - EMAIL:1:[email protected] - EMAIL:2:[email protected] - .......' union all 
    select 3, 'CCC111', 'Promo:5474 - EMAIL:0:[email protected] - BagTag: 12315 - EMAIL:1:[email protected] - EMAIL:2:[email protected] - .......' union all 
    select 1, 'DDD111', 'Promo:89474 - BagTag: 147515 - dds2121sdsd1a2 - 221221gdfgf - .......' 
) 

select RowNum 
    , RecordLocator 
    , case when CHARINDEX('EMAIL:' + cast(RowNum - 1 as char(1)), Comment) > 0 
     then SUBSTRING(Comment, CHARINDEX('EMAIL:' + cast(RowNum - 1 as char(1)), Comment) + 8, CHARINDEX(' ', Comment, CHARINDEX('EMAIL:' + cast(RowNum - 1 as char(1)), Comment)) - CHARINDEX('EMAIL:' + cast(RowNum - 1 as char(1)), Comment) - 8) 
     else 'not found' 
    end as Email 
from something 
+0

Это лучше :) – jpw

+0

Независимо от того, было бы лучше, если бы ОР мог нормализовать свои данные. –

+0

Отлично! Спасибо! –

Смежные вопросы