我在具有多个换行符和可能还有回车符的字段中有文本,此后有字符串,然后有更多的换行符和回车符。我想在换行/回车直到下一个换行之前提取文本。因此,从下面的示例中,我想提取一行Some text。数字将突出显示回车/换行,而不是实际的字段数据。
示例(行号仅用于演示)
1
2
3
4
5 Some text
6
7 Some more text
8
9 Even more text
预期的输出(第一行不为空):
Some text
答案 0 :(得分:2)
对我来说,就像您只需要在回车符上拆分此字符串一样。然而,挑战在于大多数拆分器(即使是Microsoft拆分器)也不返回元素编号。幸运的是,杰夫·摩登(Jeff Moden)拥有一个分离器,可以很好地用于此类事情。它还有其他一些限制,但在这里效果很好。您可以阅读有关拆分器here的信息。确保阅读评论,并在其中进行冗长的讨论。
使用在该文章中发现的DelimitedSplit8K,这很简单。
declare @Something table(SomeVal varchar(500))
insert @Something
select char(13) + char(13) + char(13) + 'Some text' + char(13) + 'more text'
select top 1 x.Item
from @Something s
cross apply dbo.DelimitedSplit8K(s.SomeVal, char(13))x
where x.Item > ''
order by x.ItemNumber
答案 1 :(得分:0)
感谢您的回应,我最终编写了下面的代码,并按我的要求完成了工作,因此最终没有使用DelimitedSplit8K,但将来可能会有用。
,大小写charindex(char(10),[Field]) 当为0时[字段] 其他 SUBSTRING([Field],PATINDEX('%[^'+ CHAR(10)+']%',[Field]), 情况PATINDEX('%[^'+ CHAR(13)+ CHAR(10)+']%',[Field])-charindex(char(10),[Field],PATINDEX('%[^'+ CHAR( 10)+']%',[Field]))-(PATINDEX('%[^'+ CHAR(10)+']%',[Field])) 当为0时(LEN([Field])-charindex(char(10),[Field],PATINDEX('%[^'+ CHAR(10)+']%',[Field])))) 其他 charindex(char(10),[Field],PATINDEX('%[^'+ CHAR(10)+']%',[Field]))-(PATINDEX('%[^'+ CHAR(10)+' ]%',[领域])) 结束 ) 以[Field]结尾