【问题标题】:SQL Split Row Data Separated by Spaces用空格分隔的 SQL 拆分行数据
【发布时间】:2019-07-23 01:32:56
【问题描述】:

我正在寻找一个查询 在列表中查找第 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 语句查看预期输出 -- 上面的 cmets。

这可能是一种尝试利用的解决方案。 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)')

【问题讨论】:

  • 你的预期输出是什么?
  • @DarkRob,预期输出在行数据旁边的 cmets 中...

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


【解决方案1】:

你的问题是,用空格分割字符串会导致很多空元素。选择第二个片段很有可能打到这样一个空的。

有两种方法:

  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...

ad 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-26
    • 2017-08-11
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 2011-03-18
    相关资源
    最近更新 更多