假设我们在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中相同的位置将被删除。
请告诉我是否还有人有困惑
答案 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)