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

Remove comma if value after comma is empty in sql

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

请告诉我是否还有任何困惑

使用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 @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)

好的,无论逗号的数量或缺失值的数量如何,这都有效。它使用了一个数字或计数 table,为了简化此示例,我将其包括在内:

;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

当然你会想创建一个永久号码table。