代码之家  ›  专栏  ›  技术社区  ›  kodym

删除前导和尾随逗号

  •  0
  • kodym  · 技术社区  · 6 年前

    我试图找到一种方法来删除select语句中的尾随逗号和前导逗号。以下是一些示例数据:

    颗粒、材料、背衬、砂砾,
    replace(ltrim(rtrim(replace(properties,,',''))、''、')属性,
    特殊、应用、产品类型
    从ProductFinder
    < /代码> 
    
    

    我试过使用trim、rtrim和ltrim,但没有一个能改变琴弦。如果我使用了错误的语法或什么,但有人能帮我吗?

    我正在使用SQL Server 2008。

    SELECT
        GRAIN, MATERIAL, BACKING, GRITS,
        REPLACE(LTRIM(RTRIM(REPLACE(PROPERTIES, ',', ' '))), ' ', ',') PROPERTIES,
        SPECIAL, APPLICATION, PRODUCTTYPE
    FROM PRODUCTFINDER
    

    我试过使用trim、rtrim和ltrim,但没有一个能改变琴弦。如果我使用了错误的语法或什么,但有人能帮我吗?

    我正在使用SQL Server 2008。

    4 回复  |  直到 6 年前
        1
  •  2
  •   John Cappelletti    6 年前

    只是另一个选择。

    这是一种非破坏性方法,可以消除任何重复次数 commas 并通过双管道强制进行最终清理。

    为了扩大、缩小和消除,我选择了两个模糊的字符 †‡

    例子

    Declare @S varchar(max) =',,,,Some,,,,,Content,,,'
    
    Select
        replace(
            replace(
                replace(
                    replace(
                        replace('||,' + @S + ',||', ',', '†‡'), 
                        '‡†', ''
                    ),
                    '†‡', ','
                ),
                '||,', ''
            ),
            ',||', ''
        )
    

    退换商品

    Some,Content
    

    编辑-删除了ltrim()/rtrim()。

        2
  •  1
  •   S3S    6 年前

    这里有一种方法 PATINDEX 具有 LEFT RIGHT

    declare @var varchar(64)= ',,,,,,,,asdf,dsf,sdfsd,asdf,,,,,,,,'
    
    select 
        left(right(@var,len(@var) - patindex('%[^,]%',@var) + 1)
            ,len(right(@var,len(@var) - patindex('%[^,]%',@var) + 1)) - patindex('%[^,]%',reverse(right(@var,len(@var) - patindex('%[^,]%',@var) + 1))) + 1)
    

    只是改变 @var 到您的列名。

    此代码通过搜索第一个不是逗号的值来删除前导逗号,通过 patindex('%[^,]%',@var) 把一切都带到 正确的 具有这种特征。然后,我们用 删除尾随逗号。

    select 
       Special =  left(right(Special,len(Special) - patindex('%[^,]%',Special) + 1),len(right(Special,len(Special) - patindex('%[^,]%',Special) + 1)) - patindex('%[^,]%',reverse(right(Special,len(Special) - patindex('%[^,]%',Special) + 1))) + 1)
       ,[Application] = left(right([Application],len([Application]) - patindex('%[^,]%',[Application]) + 1),len(right([Application],len([Application]) - patindex('%[^,]%',[Application]) + 1)) - patindex('%[^,]%',reverse(right([Application],len([Application]) - patindex('%[^,]%',[Application]) + 1))) + 1)
       ,[ProductType] = left(right([ProductType],len([ProductType]) - patindex('%[^,]%',[ProductType]) + 1),len(right([ProductType],len([ProductType]) - patindex('%[^,]%',[ProductType]) + 1)) - patindex('%[^,]%',reverse(right([ProductType],len([ProductType]) - patindex('%[^,]%',[ProductType]) + 1))) + 1)
    FROM PRODUCTFINDER
    
        3
  •  1
  •   Olivier Jacot-Descombes    6 年前

    试试这个:

    SELECT
        GRAIN, MATERIAL, BACKING, GRITS,
        TRIM(',' FROM PRODUCTFINDER.PROPERTIES) AS PROPERTIES,
        TRIM(',' FROM PRODUCTFINDER.SPECIAL) AS SPECIAL,
        TRIM(',' FROM PRODUCTFINDER.APPLICATION) AS APPLICATION,
        TRIM(',' FROM PRODUCTFINDER.PRODUCTTYPE) AS PRODUCTTYPE
    FROM PRODUCTFINDER
    

    我不确定要修剪哪些列。

    这种变体 TRIM (Transact-SQL) 自SQL Server 2017年起提供。


    如果您有早期版本的SQL Server,请在字体结尾(vb)中执行此操作。这也为您提供了在文本中间用单个逗号替换多个逗号的可能性。

    Dim s = ",,,Abc,,,Def,Xyz,,,"
    Console.WriteLine(Regex.Replace(s, ",{2,}", ",").Trim(","c))
    

    印刷品

    ABC,DEF,Xyz

    Regex.Replace(s, ",{2,}", ",") 使用正则表达式 ,{2,} 查找2个或多个逗号,并用一个逗号替换它们。 .Trim(","c) 删除前导和尾随逗号。

    为了 Regex 你需要一个

    Imports System.Text.RegularExpressions
    

    另一个变量使用字符串拆分 RemoveEmptyEntries 选项,然后再次联接零件以形成结果。

    Dim s = ",,,Abc,,,Def,Xyz,,,"
    Dim parts As String() = s.Split(New Char() {","c}, StringSplitOptions.RemoveEmptyEntries)
    Console.WriteLine(String.Join(",", parts))
    
        4
  •  0
  •   Jigar Joshi    6 年前

    SQL Server不是操作字符串的理想场所,因此 修剪逻辑 应该在编程级别

    由于查询中需要裁剪特定字符,请参阅下面的线程

    Trimming any Leading or trailing characters