我准备了这个演示,我想在 SQL 服务器中使用 string_split 或其他函数,可能在 case 语句中实现这样的输出:
Writer
Sabao Fulano, Sapato Feio, Jose Perreira
Toze Jose
Feijao Mauricio
编辑
这个问题与评论中建议的问题之间的区别在于,在这里,不仅要拆分逗号,而且还有一个“XX”,每个名称都以这种方式出现:
“萨宝某某,XX Some_Random_Text”成为“萨宝某某”
“Sapato Feio, XX, Jose Perreira, XX”成为“Sapato Feio, Jose Perreira”
基本上,如果旁边没有逗号的XX,那么只留下第一个实例,说“Sabao Fulano”,或者如果有XX +“,”然后删除它们中的两个(上面的第二种情况)。这个想法是只留下用逗号分隔的名称。
再会,
要求并不完全清楚,因为在描述中您说“ The goal is to have just names and not XX.
”,但在请求的结果中,您没有源中存在的文本“第 3 条”。
如果您只是想删除“,XX”,那么我们可以使用简单的 REPLACE 如下所示:
WITH WriterTbl AS (
SELECT 'Sabao Fulano, XX, Sapato Feio, XX, Jose Perreira, XX' AS Writer UNION ALL
SELECT 'Toze Jose, XX' UNION ALL
SELECT 'Feijao Mauricio, XX Article 3'
)
select REPLACE(WriterTbl.Writer,', XX',', ')
from WriterTbl
但是,如果您确实想删除以“,XX”开头的部分,并且您要求使用原始问题中提出的 STRING_SPLIT(假设您不会更改问题),那么我们可以使用 STRING_SPLIT 来查找我们需要删除的文本,然后我们可以使用函数 STRING_AGG 再次连接文本
有一点你必须记住,我敢肯定大多数人都没有想到:STRING_SPLIT 不保证结果的顺序,这意味着通过拆分文本并重新连接它,你可能会得到不同的结果命令
根据这些限制和您的要求,请检查此解决方案:
WITH WriterTbl AS (
SELECT 'Sabao Fulano, XX, Sapato Feio, XX, Jose Perreira, XX' AS Writer UNION ALL
SELECT 'Toze Jose, XX' UNION ALL
SELECT 'Feijao Mauricio, XX Article 3'
),
MyCTE AS(
select MyGroup = ROW_NUMBER() OVER (order by (select null)), t1.Writer
from WriterTbl t1
)
SELECT STRING_AGG(t2.[value], ',')
FROM MyCTE t1
CROSS APPLY (
SELECT * from STRING_SPLIT (t1.Writer, ',') t2
) t2
where not t2.[value] like ' XX%'
group by MyGroup
笔记!不建议执行此任务,我强烈建议您重新考虑您的要求和架构!
子注!即使您仍然需要从这个输入中获得这个结果,那么您可能应该创建自己的函数而不是使用内置函数 STRING_SPLIT。没有理由拆分数据以将其连接回来。在您的用户函数中,您可以简单地删除以“, XX”开头并以“,”结束的文本,或者如果这是值的最后一部分。这里的解决方案是根据您的要求使用 STRING_SPLIT
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句