我正在寻找一个查询 在列表中找到第n个值。分隔符大于等于2个空格。 (可以是3个或5个空格)。 尝试避免标量值函数,因为性能可能会变慢。句子中可以包含5-20个单词。
create table dbo.TestWrite (TestWriteId int primary key identity(1,1), TextRow varchar(255))
insert into dbo.TestWrite (TextRow)
I am writing SQL Code. -- Row 1: Column 1: I , Column 2: am, Column 3: writing...
SQL keywords include join, except, where. -- Row 2: Column 1: SQL, Column 2: keywords, Column 3: include...
想在带有列的单独行中查看预期的输出-上面的注释,使用select语句。
这可能是一种尝试利用的解决方案。 Using T-SQL, return nth delimited element from a string
DECLARE @dlmt NVARCHAR(10)=N' ';
DECLARE @pos INT = 2;
SELECT CAST(N'<x>' + REPLACE(@input,@dlmt,N'</x><x>') + N'</x>' AS XML).value('/x[sql:variable("@pos")][1]','nvarchar(max)')
答案 0 :(得分:2)
您的问题是这样的事实,即用空格分隔字符串会导致很多空元素。选择第二个片段的机会很高,可以击中这样一个空片段。
有两种方法:
XQuery
仅返回具有text()
节点的元素。尝试一下:
DECLARE @TestWrite TABLE(TestWriteId int primary key identity(1,1), TextRow varchar(255))
insert into @TestWrite (TextRow) values
('I am writing SQL Code.') -- Row 1: Column 1: I , Column 2: am, Column 3: writing...
,('SQL keywords include join, except, where.'); -- Row 2: Column 1: SQL, Column 2: keywords, Column 3: include...
广告1 .:使用任意两个字符,它们不会出现在字符串中
SELECT REPLACE(REPLACE(REPLACE(TextRow,' ','<>'),'><',''),'<>',' ')
FROM @TestWrite;
广告2。
DECLARE @dlmt NVARCHAR(10)=N' ';
DECLARE @pos INT = 2;
SELECT CAST(N'<x>' + REPLACE(t.TextRow,@dlmt,N'</x><x>') + N'</x>' AS XML)
.query('/x[text()]') --<-- Here's the magic
.value('/x[sql:variable("@pos")][1]','nvarchar(max)')
FROM @TestWrite t