SQL分隔行数据用空格分隔

时间:2019-03-01 03:24:57

标签: sql sql-server split substring sql-server-2016

我正在寻找一个查询 在列表中找到第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)')

1 个答案:

答案 0 :(得分:2)

您的问题是这样的事实,即用空格分隔字符串会导致很多空元素。选择第二个片段的机会很高,可以击中这样一个空片段。

有两种方法:

  1. 删除所有多个空格,以单个空格作为分隔符返回您的字符串。然后使用您在其他问题中找到的方法。
  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
相关问题