Sql server SQL从第三个单词中选择字符串中的所有单词

Sql server SQL从第三个单词中选择字符串中的所有单词,sql-server,string,Sql Server,String,我的数据集正在更改,现在在“我的客户名称”字段的开头增加了两个字,在将数据移动到我的主客户表之前,我需要清理这些数据 我需要做的是在select语句中只保留第二个空格后的单词 有人能建议一种方法吗 i、 e.“ZENDUSER ABCABC S ROCCO AL-PORTO”需要返回为“S ROCCO AL-PORTO”您可以使用CHARINDEX和子字符串来执行此操作: declare @a varchar(200) set @a = 'ZENDUSER ABCABC S ROCCO AL

我的数据集正在更改,现在在“我的客户名称”字段的开头增加了两个字,在将数据移动到我的主客户表之前,我需要清理这些数据

我需要做的是在select语句中只保留第二个空格后的单词

有人能建议一种方法吗


i、 e.“ZENDUSER ABCABC S ROCCO AL-PORTO”需要返回为“S ROCCO AL-PORTO”

您可以使用CHARINDEX和子字符串来执行此操作:

declare @a varchar(200)

set @a = 'ZENDUSER ABCABC S ROCCO AL PORTO'

select  @a, substring(@a, charindex(' ', @a, charindex(' ', @a, 1) + 1) + 1, 200)
dbfiddle

试试这个:

select substring(MyColumn, CHARINDEX(MyColumn, ' ', CHARINDEX(MyColumn, ' ', 1) + 1) + 1, Len(MyColumn)) from MyTable

我知道,这与MJH的答案非常相似,但另外,我在
substring
方法中使用
Len(MyColumn)
,因此我们确保在第二个空格后包含所有字符。另一个答案只需要200个字符。

如果您希望修剪更加动态,即从第5个单词等开始,可以使用以下代码段。我会将其封装在一个内联函数中以获得额外的功能

    DECLARE @Sentence NVARCHAR(200) = 'ZENDUSER ABCABC S ROCCO AL PORTO'
    DECLARE @Del NVARCHAR(2)= ' '
    DECLARE @WordStart INT = 5

    ;WITH Nums (n) as 
        (
        SELECT TOP (LEN(@Sentence)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
        FROM (VALUES (0),(0),(0),(0),(0),(0),(0),(0)) a(n)
        CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n)
        CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n)
        CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) d(n)
        )
    , Main as 
    (
    SELECT N, x.val , Ind , CASE WHEN n = 1 THEN 1  ELSE SUM(Ind) OVER (ORDER BY n) + 1  END Pos
    FROM Nums
        CROSS APPLY 
            (
            VALUES (SUBSTRING(@Sentence,n,1),
            CASE WHEN SUBSTRING(@Sentence,n,1) = @Del THEN 1 ELSE 0 END) 

            ) x(val, Ind)
    )
    , Combine (StrOut) as 
    (
    SELECT LTRIM(RTRIM(STUFF(
            CAST((SELECT ''+ val
            FROM Main
            WHERE Pos >= @WordStart
            FOR XML PATH (''),TYPE) AS NVARCHAR(MAX)),1,0,'')
            )))
     SELECT StrOut 
     FROM Combine
更新:创建函数

    CREATE FUNCTION dbo.SentenceSplitter 
    (
    @Sentence NVARCHAR(2000),
    @WordStart INT,
    @Del NVARCHAR(2) = ' ' 
    )
    RETURNS TABLE AS RETURN

        WITH Nums (n) as 
                (
                SELECT TOP (LEN(@Sentence)) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
                FROM (VALUES (0),(0),(0),(0),(0),(0),(0),(0)) a(n)
                CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n)
                CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n)
                CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) d(n)
                )
            , Main as 
            (
            SELECT N, x.val , Ind , CASE WHEN n = 1 THEN 1  ELSE SUM(Ind) OVER (ORDER BY n) + 1  END Pos
            FROM Nums
                CROSS APPLY 
                    (
                    VALUES (SUBSTRING(@Sentence,n,1),
                    CASE WHEN SUBSTRING(@Sentence,n,1) = @Del THEN 1 ELSE 0 END) 

                    ) x(val, Ind)
            )
            , Combine (StrOut) as 
            (
            SELECT LTRIM(RTRIM(STUFF(
                    CAST((SELECT ''+ val
                    FROM Main
                    WHERE Pos >= @WordStart
                    FOR XML PATH (''),TYPE) AS NVARCHAR(MAX)),1,0,'')
                    )))
             SELECT StrOut 
             FROM Combine
用例:

SELECT StrOut
FROM dbo.SentenceSplitter ('ZENDUSER ABCABC S ROCCO AL PORTO', 5, ' ')
将导致:

StrOut
AL PORTO

我的答案使用200个字符,因为varchar定义的最大长度为200个字符,您可以在其中使用任何您想要的值(只要它至少等于最大长度),我的解决方案将起作用。这就是为什么最好在那里使用字符串的长度;)感谢所有响应我请求帮助的人OK,这可能会很有用——我需要与它合作,看看它在做什么。我认为这个函数不能作为交叉应用程序来工作,因为它在函数中添加了一个变量,在这个变量中输入单词以ie StrOut(2)开头,以返回第二个空格或StrOut(3)中的所有内容返回第3个空格中的所有内容。我将添加另一部分,介绍如何将其封装为函数以及如何使用itI。我已经编辑了脚本,并创建了其他函数以及如何使用它。如果有帮助,请告诉我。
StrOut
AL PORTO