sql - 字符串操作/正则表达式
问题描述
我有一个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"*
有什么建议么?
谢谢,
解决方案
这个查询非常丑陋,但可以完成工作。基本上,您从要查找的键的位置(“Targeted Org”、“Targeted Space”和“Api Endpoint”)检索子字符串,直到下一个“\n”字符串的位置。最后,您从先前的结果中删除该键。
使用的功能:
- charindex获取字符串中子字符串的位置
- substring获取两个位置之间的子字符串
- replace从上一个结果中删除搜索到的键
- 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
推荐阅读
- c# - Xamarin - CareouselView(和其他视图)中是否有类似于 ListView 的 CachingStrategy 属性的属性?
- c - 将 INFIX 表达式转换为等效的 POSTFIX 表达式
- python - 即使没有事件,我也希望我的 for 循环更新
- ruby-on-rails - 将排行榜报告下载到 csv rails
- c# - NPOI如何获取单元格中文本的大小
- asp.net-core - EF Core - 在没有外键约束的两个模型之间创建关系
- angular - 检测在订阅块中更新的 BehaviorSubject 组件成员变量的变化?
- javascript - '<' 字符在我输入时显示
- flutter - 如何有效地保存和检索后端数据库中元素的位置?
- python - python vtk 多个渲染器和方向小部件