Sql server SQL从第三个单词中选择字符串中的所有单词
我的数据集正在更改,现在在“我的客户名称”字段的开头增加了两个字,在将数据移动到我的主客户表之前,我需要清理这些数据 我需要做的是在select语句中只保留第二个空格后的单词 有人能建议一种方法吗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
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