如果 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。
假设我们在 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。