Манипуляции с строками / регулярные выражения - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть столбец NVARCHAR(MAX), в котором хранится поток журнала. Что мне нужно, это извлечь некоторые значения на уровне оператора select. Поскольку я не могу применить регулярное выражение без CLR, каково будет решение с использованием некоторых функций «манипуляции со строками»?

Например, у меня может быть это значение в столбце Log:

$CF_NONPROD_USERNAME -p $CF_NONPROD_PASSWORD -o $ORG -s $SPACE\u001B[0;m\nAPI endpoint: https://api.server02.pcf.com/\nAuthenticating...\nOK\n\nTargeted org Order-PSOrg\n\nTargeted space TEST4\n\n\n\nAPI endpoint:   https://api.server02.pcf.com (API version: 2.131.0)\nUser:           myuser@user.from.ldap.cf\nOrg:            Order-PSOrg\nSpace:          TEST4\n\u001B[32;1m$ $PRE_DEPLOY_CMD\u001B[0;m\n\"Deployment started\"\n\u001B[32;1m$ cf push $APP_NAME -p $TARGET -f $PCF_MF_FILE --no-start\u001B[0;m\nPushing f

Мне нужно извлечь:

Targeted Org = *in this sample would be "Order-PSOrg"*

Targeted Space = *in this sample would be "TEST4"*

Api Endpoint = *in this sample would be "https://api.server02.pcf.com"*

Есть предложения?

Спасибо

1 Ответ

0 голосов
/ 30 апреля 2020

Этот запрос серьезно уродлив, но делает свою работу. По сути, вы извлекаете подстроку с позиции искомого ключа («Целевая организация», «Целевое пространство» и «Конечная точка Api») до положения следующей строки «\ n». Наконец, вы удаляете этот ключ из предыдущего результата.

Используемые функции:

  1. charindex , чтобы получить позицию подстроки в строке
  2. подстрока для получения подстроки между двумя позициями
  3. заменить для удаления искомого ключа из предыдущего результата
  4. ltrim и rtrim для удаления пробелов в начале и конце

Запрос:

create table MyLogsTable (Log varchar(max))    
insert into MyLogsTable (Log) values ('$CF_NONPROD_USERNAME -p $CF_NONPROD_PASSWORD -o $ORG -s $SPACE\u001B[0;m\nAPI endpoint: https://api.server02.pcf.com/\nAuthenticating...\nOK\n\nTargeted org Order-PSOrg\n\nTargeted space TEST4\n\n\n\nAPI endpoint: https://api.server02.pcf.com (API version: 2.131.0)\nUser: myuser@user.from.ldap.cf\nOrg: Order-PSOrg\nSpace: TEST4\n\u001B[32;1m$ $PRE_DEPLOY_CMD\u001B[0;m\n\"Deployment started\"\n\u001B[32;1m$ cf push $APP_NAME -p $TARGET -f $PCF_MF_FILE --no-start\u001B[0;m\nPushing f')

select ltrim(rtrim(replace(substring(Log, charindex('Targeted Org', Log), charindex('\n', Log, charindex('Targeted Org', Log)) - charindex('Targeted Org', Log)), 'Targeted Org', ''))) as Target_Org,
       ltrim(rtrim(replace(substring(Log, charindex('Targeted Space', Log), charindex('\n', Log, charindex('Targeted Space', Log)) - charindex('Targeted Space', Log)), 'Targeted Space', ''))) as Target_Space,
       ltrim(rtrim(replace(substring(Log, charindex('Api Endpoint:', Log), charindex('\n', Log, charindex('Api Endpoint:', Log)) - charindex('Api Endpoint:', Log)), 'Api Endpoint:', ''))) as Api_Endpoint       
from MyLogsTable       

Вы можете видеть, что это работает в DBFiddle

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