【问题标题】:Substring after a space空格后的子字符串
【发布时间】:2017-11-24 01:06:50
【问题描述】:

我想拆分一个字符串并获取空格后面的值。我可以在空格之前获取值,但是如何获取空格之后的字符串。

DECLARE @string varchar(20) 
SELECT @string = 'Test Name'
SELECT SUBSTRING(@string, 0, CHARINDEX(' ', @string))

编辑:我使用的是 SQLServer 2012

【问题讨论】:

  • 您是否总是有 2 个部分(1 个空格),或者您想在每次出现所选字符时拆分一个字符串?多个空间呢?

标签: sql-server string sql-server-2012 substring


【解决方案1】:

我找到了

SELECT  SUBSTRING(@string, CHARINDEX(' ', @string) +1, DATALENGTH(@string) - CHARINDEX(' ', @string) +1 )

“从给定位置获取字符串的剩余部分”的语法很冗长,所以我改为“删除”位置之前的部分:

SELECT  STUFF(@string, 1, CHARINDEX(' ', @string), '')

STUFF ( character_expression , start , length , replaceWith_expression )

这两种方法的工作方式相同,包括 CHARINDEX 不匹配的地方

【讨论】:

    【解决方案2】:

    这是一个使用 SUBSTRINGCHARINDEX 的版本,用于 SQL Server 2016 之前的 SQL SERVER 版本,当时引入了STRING_SPLIT

    以下任一作品:

    SELECT  SUBSTRING(@string, CHARINDEX(' ', @string) +1, 20)
    
    SELECT  SUBSTRING(@string, CHARINDEX(' ', @string) +1, DATALENGTH(@string) - CHARINDEX(' ', @string) +1 )
    

    根据 Rao 的评论编辑添加描述

    我们需要使用 CHARINDEX 找到空格的位置(它返回一个代表字符串(空格)开始位置的数字。但是我们要选择的字符串在空格之后开始,因此我们必须加 1 (+1 ) 到我们的 SUBSTRING 的起始位置,使起始位置变为 CHARINDEX(' ', @string) + 1。

    SUBSTRING 的第三个参数是要选择的字符串的长度,在第一种情况下,我假设您指定为 varchar(20) 的字符串不能超过 20 个字符,因此我使用 20。注意 SUBSTRING 将不要尝试选择超出字符串末尾的字符,因此指定长度大于剩余字符数是安全的。

    我的第二个示例获取要选择的字符串的长度,基于它是总字符串的长度 (DATALENGTH) 减去我们选择之前的字符数 (CHARINDEX + 1)

    【讨论】:

    • 谢谢你的工作。如果你不介意你能解释一下它是如何工作的。请在第一个查询和第二个查询中输入“+1”和 20。
    • 非常感谢
    【解决方案3】:

    不要使用子字符串,而是使用string_split。这将返回一个字符串数组。

     SELECT value FROM STRING_SPLIT('Lorem ipsum dolor sit amet.', ' ');
    

    这将返回以下数组:

    Lorem
    ipsum
    dolor
    sit
    amet.
    

    更多信息可以在这里找到:https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql

    【讨论】:

    • 感谢您的回复,但我使用的是 SQLServer 2012。我的错我没有在我的问题中提到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 2020-05-16
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多