带case语句的字符串拆分或其他类似的SQL Server函数

时间:2018-08-22 11:07:56

标签: sql-server replace split

我准备了this demo,我想在case语句中使用string_split或SQL Server中的其他函数来实现如下输出:

Writer   
Sabao Fulano, Sapato Feio, Jose Perreira
Toze Jose
Feijao Mauricio

编辑

此问题与注释中建议的问题之间的区别在于,这里不仅要拆分逗号,而且每个名称都以这种方式附带一个“ XX”:

  1. “ Sabao Fulano,XX Some_Random_Text”成为“ Sabao Fulano”

  2. “萨帕托·费奥,XX,何塞·佩雷拉,XX”成为“萨帕托·费奥,何塞·佩雷拉”

基本上,如果旁边有 XX 且没有逗号,则仅保留第一个实例,例如“ Sabao Fulano”,或者如果有 XX +“,” 然后删除其中两个(上述第二种情况)。想法是只用逗号分隔名称。

2 个答案:

答案 0 :(得分:1)

美好的一天,

由于在描述中您说“ 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

  

答案 1 :(得分:0)

尝试此查询:

select case when lastComma < firstXX then substring(writer, 1, lastComma - 1)
            else replace(replace(writer, 'XX', ''), ', ,',',') end
from (
    select *,
           charindex('XX', writer) firstXX,
           len(writer) - charindex(',', reverse(writer)) + 1 lastComma
    from WriterTbl
) a

根据逗号的最后一个索引和XX的首次出现,在外部查询中确定是要删除最后一个条目还是只替换XX(此外,我还添加了将双逗号替换为一个)