【问题标题】:Removing leading and trailing commas删除前导和尾随逗号
【发布时间】:2018-07-26 14:54:50
【问题描述】:

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

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

我尝试使用 trim、rtrim 和 ltrim,但它们都没有更改字符串。如果我使用了错误的语法或什么,我想知道,但是有人可以帮我吗?

我使用的是 SQL Server 2008。

【问题讨论】:

  • 也许您可以分享您的选择语句,这样我们就不会猜测您在做什么?
  • 如果可能的话,最好先防止这些垃圾字符被存储
  • 刚刚添加了选择语句@SeanLange
  • ltrim 和 rtrim 删除前导和尾随空格。这些功能不会删除逗号。你能分享更多细节吗?查看您的表格和数据将非常有帮助。这是发布内容的一个很好的例子。 spaghettidba.com/2015/04/24/… 但看起来真正的问题是数据。
  • 图片不好。为什么? meta.stackoverflow.com/questions/285551/…

标签: sql-server vb.net


【解决方案1】:

只是另一种选择。

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

对于扩展、缩减和消除,我选择了两个不起眼的字符†‡

示例

Declare @S varchar(max) =',,,,Some,,,,,Content,,,'

Select
    replace(
        replace(
            replace(
                replace(
                    replace('||,' + @S + ',||', ',', '†‡'), 
                    '‡†', ''
                ),
                '†‡', ','
            ),
            '||,', ''
        ),
        ',||', ''
    )

退货

Some,Content

编辑 - 删除了 LTRIM()/RTRIM()

【讨论】:

  • @kodym 很高兴为您提供帮助。
  • 简洁的方法,虽然起初令人困惑+1
  • @scsimon 全面披露:Gordon 几个月前使用 演示了这种技术,我只是使用更多模糊字符来避免与 HTML 冲突
【解决方案2】:

试试这个:

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,请在 Font-End (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))

【讨论】:

  • 这会破坏 select 语句,我有 SQL SERVER 2008
【解决方案3】:

这是一种使用PATINDEXLEFTRIGHT 的方法。

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) 搜索第一个不是逗号的值来去除前导逗号,并将所有内容带到此字符的RIGHT。然后,我们使用LEFT 执行相同的操作来删除结尾的逗号。

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

【讨论】:

    【解决方案4】:

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

    关于查询中需要修剪特定字符,请参考下面的线程

    Trimming any Leading or trailing characters

    【讨论】:

      猜你喜欢
      • 2021-01-25
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      • 2014-01-30
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多