Как выбрать слова до и после ключевого слова - PullRequest
0 голосов
/ 02 июля 2019

У меня есть таблица BomNarration со столбцом Narration, содержащим строку текстов, и в каждой строке есть одно ключевое слово Rev. Я хочу выбрать слова до и после ключевого слова. Одна проблема состоит в том, что в разных строках слова, которые я хочу выбрать, имеют разную длину, а ключевое слово может быть где угодно. Два примера строки текста в столбце: «сделай это для такого GX-77568 REV A.» и «Следуйте BW-8452-355 REV D для этого, этого, того».

Я пишу запрос sql на R studio для отправки на сервер sqlserver. Прямо сейчас я могу получить только 11 символов до ключевого слова и все после ключевого слова.

SELECT LEFT(SUBSTRING(BomNarration.Narration, 
    (CHARINDEX('REV', BomNarration.Narration) - 12), 
    LEN(BomNarration.Narration)), 11) AS Drawing,
    LEFT(SUBSTRING(BomNarration.Narration, 
    (CHARINDEX('REV', BomNarration.Narration) + 3), 
    LEN(BomNarration.Narration)), 3) AS RevNum
FROM BomNarration

Я ожидал, что появится только 11 символов перед ключевым словом и 3 символа после ключевого слова. Мне нужно только слово до и после ключевого слова («GX-77568», «A.» и «BW-8452-355», «D»). Но я получаю только 11 символов перед ключевым словом и все после ключевого слова ("ch GX-77568" "A." и "BW-8452-355" "D для этого, это, это")

Таблица результатов на моем экране

   Op Ln     Drawing                        RevNum
<       
1   1 10 ING 33B8222                             -
<       
2   1 13 RSC16A0019   D. AN NCR MUST BE RAISED AND
<       
3   1 20 NG C16A0019                             E
<       
4   5  2 SW-900-0009                             B
<       
5   6  6 SW-800-0004                             A
<       
6  14 24 SW-900-0078                             A
<       
7  15 12 SW-900-0078                             A
<       
8  16  4 SW-800-0006                             A
<       
9  22  6 SW-800-0006                             A
<       
10 25  4 SW-900-0008                             C
<       
11 27  3 SW-900-0055                             B
<       
12 28  4 SW-900-0055                             B
<       
13 29  3 SW-900-0055                             B
<       
14 30  3 SW-900-0055                             B
<       
15 36  1 SW-900-0255                             A
<       
16 36  4 SW-900-0266                             A
<       
17 36  8 SW-900-0057                  A. IF THIS *
<       
18 39  2 SW-900-0041                             A
<       
19 45  3 SW-900-0020                             A
<       
20 46  2 SW-900-0020                             A

Просто чтобы прояснить, я бы отобразил весь код

SELECT BomOperation.Op, 
CASE WHEN BomOperations.AutoNarrCode = 0
THEN BomOperationsStd.Ln
ELSE BomOperations.Ln
END,
CASE WHEN BomOperations.AutoNarrCode = 0
THEN LEFT(SUBSTRING(BomNarrationStd.Narration, (CHARINDEX('REV', BomNarrationStd.Narration) - 12), LEN(BomNarrationStd.Narration)), 11)
ELSE LEFT(SUBSTRING(BomNarration.Narration, (CHARINDEX('REV', BomNarration.Narration) - 12), LEN(BomNarration.Narration)), 11)
END
CASE WHEN BomOperations.AutoNarrCode = 0
THEN LEFT(SUBSTRING(BomNarration.NarrationStd, CHARINDEX('REV', BomNarrationStd.Narration) + 3, LEN(BomNarrationStd.Narration)), 3)
ELSE LEFT(SUBSTRING(BomNarration.Narration, CHARINDEX('REV', BomNarration.Narration) + 3, LEN(BomNarration.Narration)), 3)
END
FROM ......

1 Ответ

0 голосов
/ 02 июля 2019

Три знака после 'REV' равны

Left(SUBSTRING(BomNarration.Narration, CHARINDEX('REV', BomNarration.Narration) + 3, LEN(BomNarration.Narration)), 3)

DEMO

SELECT LEFT(SUBSTRING(BomNarration.Narration, 
    (CHARINDEX('REV', BomNarration.Narration) - 12), 
    LEN(BomNarration.Narration)), 11) AS Drawing,
    LEFT(SUBSTRING(BomNarration.Narration, 
    (CHARINDEX('REV', BomNarration.Narration) + 3), 
    LEN(BomNarration.Narration)), 3) AS RevNum
FROM (values
   ('do this that for such such GX-77568 REV A.')
   ,('Follow BW-8452-355 REV D for this this that that'))
BomNarration(Narration)

возвращает

Drawing RevNum
ch GX-77568  A.
BW-8452-355  D 

Ваш код после последнего редактирования работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...