如果逗号中的值在sql中为空,则删除逗号

时间:2015-01-07 09:38:25

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

假设我们在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中相同的位置将被删除。

请告诉我是否还有人有困惑

3 个答案:

答案 0 :(得分: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)) 

答案 1 :(得分:0)

无论逗号数量或缺失值的数量如何,这都可行。它使用了我为了简单起见而包含的数字或计数表:

;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

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

答案 2 :(得分:-1)

这样的事情应该有效:

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)