Получить текст между двумя периодами в значении - PullRequest
0 голосов
/ 18 января 2020

Я немного крутился о том, как сделать sh в SQL DW. Мне нужно извлечь текст между двумя периодами в возвращаемом значении. Таким образом, мое значение, возвращаемое для Result:

![enter image description here

Я пытаюсь извлечь значения между периодами 1 и 2, поэтому красная часть выше:

enter image description here

Значения будут самыми разными по длине.

У меня есть этот код: substring(Result,charindex('.',Result)+1,3) as ResultMid, который приводит к этому :

enter image description here

Моя проблема в том, что я не уверен, как получить переменную длину для возврата, чтобы я мог получить полное значение между двумя периоды. Кто-нибудь случайно узнает, как я могу это сделать?

Спасибо, Джо

Ответы [ 2 ]

1 голос
/ 18 января 2020

Мы можем опираться на вашу текущую попытку:

substring(
    result,
    charindex('.', result) + 1,
    charindex('.', result, charindex('.', result) + 1) - charindex('.', result) - 1
)

Обоснование: у вас уже есть первые два аргумента для substring() справа. Третий аргумент определяет количество символов для захвата. Для этого мы вычисляем положение следующей точки (.) с выражением: charindex('.', result, charindex('.', result) + 1). Затем мы вычитаем позицию первой точки из этого значения, что дает нам количество символов, которые мы должны захватить.

Демонстрация на DB Fiddle :

result                   | result_mid
:----------------------- | :---------
sam.pdc.sys.paas.l.com   | pdc       
sm.ridl.sys.paas.m.com   | ridl      
s.sandbox.sys.paas.g.com | sandbox   
0 голосов
/ 18 января 2020

Если вы имеете дело с 128 символами на разделенную часть строки, попробуйте parsename, как показано ниже. В противном случае у GMB есть довольно хорошее решение solid.

select *, parsename(left(result,charindex('.',result,charindex('.',result)+1)-1),1) as mid
from your_table;

Другой метод, который вы можете легко изменить, чтобы извлечь 3-ю, 4-ю ... (надеюсь, не слишком удаленную) часть строки, используя cross apply.

select result, mid
from your_table t1
cross apply (select charindex('.',result) as i1) t2
cross apply (select charindex('.',result,(i1 + 1)) as i2) t3
cross apply (select substring(result,(i1+1),(i2-i1-1)) as mid) t4;

DEMO

...