0

我有一个名为“响应”的列,其中包含有关一个人的大量数据。

我只想在特定字符串之后返回信息

但是,有时使用下面的方法(当人们的智商 <100 时)得到 | 紧跟在所需数字之后..

我想要'PersonIQ ='之后的任何字符,但只在管道之前。

我不确定实现这一目标的最佳方法。

查询速度是一个问题,我对嵌套 CASE 的想法可能不是最好的解决方案。

任何建议表示赞赏。谢谢

substring(response,(charindex('PersonIQ=',response)+9),3)
4

2 回答 2

0

这是我的建议:

declare @s varchar(200) = 'aaa=bbb|cc=d|PersonIQ=99|e=f|1=2'
declare @iq varchar(10) = 'PersonIQ='
declare @pipe varchar(1) = '|'

select substring(@s, 
        charindex(@iq, @s) + len(@iq), 
        charindex(@pipe, @s, charindex(@iq, @s)) - (charindex(@iq, @s) + len(@iq)) 
        )

而不是3在您的公式中,您应该使用公式的最后一部分计算@iq 和@pipe 之间的空间charindex(@pipe, @s, charindex(@iq, @s)) - (charindex(@iq, @s) + len(@iq)),它获取@iq 之后的第一个@pipe 索引,然后对IQ 值的索引进行子结构。

于 2015-04-26T05:57:15.970 回答
0

假设总是有一个管道,你可以这样做:

substring(stuff(reponse,1,charindex('PersonIQ=',reponse)-1,''),1,charindex('|',stuff(reponse,1,charindex('PersonIQ=',reponse)-1,''))-1)

或者,您可以将字符串转换为 xml 并直接引用 PersonIQ,例如:

--assuming your string looks something like this..
declare @s varchar(max) = 'asdaf=xxx|PersonIQ=100|xxx=yyy'

select convert(xml, '<x ' + replace(replace(@s, '=', '='''), '|', ''' ') + '''/>').value('(/x/@PersonIQ)[1]','int')
于 2015-04-25T23:25:19.213 回答