【问题标题】:Remove comma if value after comma is empty in sql如果 sql 中逗号后的值为空,则删除逗号
【发布时间】:2015-01-07 09:38:24
【问题描述】:

假设我们在sql中有两个变量

DECLARE @str1 nvarchar(max) = 'FirstName,MiddleName,LastName'
DECLARE @str2 nvarchar(max) = 'John,,Adams'

现在您可以看到第二个变量中第一个逗号后的值是空的,如果发生这种情况,我想从字符串中删除相同的条目。

-- Expected Result Would be 
Result of str1 =  FirstName,LastName
Result of str2 =  'John,Adams'

注意 可以肯定的是,如果 str1 有 3 个项目,那么 str2 也将有 3 ,不管是空字符串

更新

上面给出的只是一个例子str1 可能有 100 个逗号 str2 将始终具有与 str1 相同数量的逗号。现在我们要做的是,假设我们在 str2 的任何位置(假设 10 或 20 或 32 ....任何地方)有一个空条目,与 str1 的位置相同的项目将被删除。

如果还有人困惑,请告诉我

【问题讨论】:

  • 是否有@str2 = 'John, James,' 值或@str2 = ',James,Adams'
  • NO @HansKesting 它永远不会有任何尾随或前导逗号
  • 您要解决的实际问题是什么?为什么要在 SQL 中这样做?字符串操作应在客户端或 ETL 期间完成。或者可以通过将 CSV 值转换为表变量并加入它们来解决实际问题
  • @Ancient 我添加了动态答案
  • 更好地规范化您的数据,这样您就不必在 TSQL 中进行字符串操作

标签: sql sql-server sql-server-2008


【解决方案1】:

使用Replace。试试这个。

DECLARE @str1 NVARCHAR(max) = 'FirstName,MiddleName,LastName'
DECLARE @str2 NVARCHAR(max) = 'John,,Adams'

SELECT Parsename(Replace(Replace(@str2, ',,', ',abc,'), ',', '.'), 3)
       + ','
       + Parsename(Replace(Replace(@str2, ',,', ',abc,'), ',', '.'), 1)

SELECT Parsename(Replace(Replace(@str1, ',,', ',abc,'), ',', '.'), 3)
       + ','
       + Parsename(Replace(Replace(@str1, ',,', ',abc,'), ',', '.'), 1) 

更新:超过四项

DECLARE @str1 NVARCHAR(max) = 'FirstName,MiddleName,LastName,Address'
DECLARE @str2 NVARCHAR(max) = 'Jhon,,,Berlin'

SELECT LEFT(@str1, Charindex(',', @str1)-1) + ','
       + Reverse(LEFT(Reverse(@str1), Charindex(',', Reverse(@str1))-1))

SELECT LEFT(@str2, Charindex(',', @str2)-1) + ','
       + Reverse(LEFT(Reverse(@str2), Charindex(',', Reverse(@str2))-1)) 

【讨论】:

  • 这不适用于本示例 DECLARE str1 nvarchar(max) = 'FirstName,MiddleName,LastName,c' DECLARE str2 nvarchar(max) = 'John,,Adams,d' @古代
  • @SarathAvanavu 是对的,它不会工作,我已经说过你的第一个也是一个可行的解决方案,但它不会涵盖所有场景,目前的答案也不会。
  • 我将其标记为已回答,因为它适用于静态条件 not any 。这就是为什么,让我猜你们两个都能看到
  • 我标记你的答案是正确的,但如果你改进你的动态答案,我会给你赏金
  • 如果是这样,那没关系。为什么我提到的是下一个将要找到这个问题的人将很容易解决它。我知道 NoDisplayName 擅长查询。所以我建议他也更新一下 :) @Ancient
【解决方案2】:

好的,不管逗号的数量或缺失值的数量如何,这都有效。为了简单起见,它使用了一个数字或计数表:

;WITH Tally (Number) AS
(
    -- 1000 rows
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) 
    FROM (VALUES(0),(0),(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)
)
SELECT *
Into #Numbers
FROM Tally;

DECLARE @str1 NVARCHAR(max) = 'FirstName,MiddleName,LastName,Initial,County,State,Address'
DECLARE @str2 NVARCHAR(max) = 'Jhon,,Isiah,,Black Forest,,Berlin'

DECLARE @result1 VARCHAR(MAX)
DECLARE @result2 VARCHAR(MAX)


;WITH CTE
AS
(
    SELECT Item = SUBSTRING(@str1, Number, 
            CHARINDEX(',', @str1 + ',', Number) - Number),
            ROW_NUMBER() OVER (ORDER BY Number) AS RN
            FROM #Numbers
            WHERE Number <= CONVERT(INT, LEN(@str1))
                AND SUBSTRING(',' + @str1, Number, 1) = ','
),
CTE2
As
(
    SELECT Item = SUBSTRING(@str2, Number, 
            CHARINDEX(',', @str2 + ',', Number) - Number),
            ROW_NUMBER() OVER (ORDER BY Number) AS RN
            FROM #Numbers
            WHERE Number <= CONVERT(INT, LEN(@str2))
                AND SUBSTRING(',' + @str2, Number, 1) = ','
)
SELECT @result1 = COALESCE(@result1+', ' ,'') + CTE.Item, @result2 = COALESCE(@result2+', ' ,'') + CTE2.Item
FROM CTE
INNER JOIN CTE2
    ON CTE.RN = CTE2.RN
WHERE CTE2.Item <> ''

SELECT @result1
SELECT @result2

这给出了以下结果:

FirstName, LastName, County, Address
Jhon, Isiah, Black Forest, Berlin

当然你会想要创建一个永久的数字表。

【讨论】:

    【解决方案3】:

    这样的事情应该可以工作:

    DECLARE @commapos1 int 
    DECLARE @commapos2 int
    
    SET @commapos1 =CHARINDEX(",",@str1, 1)          --position of first comma
    SET @commapos2 =CHARINDEX(",",@str1, commapos1)  --position of second comma
    
    SELECT LEFT(@str1, commapos1), RIGHT (@str1, commapos2+1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多