我有一个关于替换字符串中特定位置的字符的问题。我的c#应用程序能够读取文件,例如:TXT,CSV,Excel,数据库等,并将它们导入网络上的SQL服务器(用户可以选择我们导入文件的服务器)。该应用程序用于将两个导入的文件相互比较。为了改善两个表之间的比较,我希望能够替换一些特定的字符。举个例子。第一个导入文件中的一列包含没有任何特殊字符的部件号。第二个导入的文件也有一个与第一个导入文件具有相同编号的列,只有那些部分编号在每个第三个字符上用一个点分隔。为了改善搜索,我删除了第二个导入文件中的所有点。这可以通过REPLACE交易轻松完成。查询(从我的c#应用程序中提取,我不想创建存储过程,因为服务器可以由用户选择更改)将如下所示:
UPDATE myTable SET myColumn = REPLACE(myColumn , '.', '');
这个替换声明工作得很好。然而,我想要实现的困难部分。假设第一个导入文件中的列具有如下所示的partnumbers:
132105213.000
452993424.001
436345332.002
etc...
并且第二个导入的文件具有相同的partnumbers,它们看起来像这样:
132.105.213.000
452.993.424.001
436.345.332.002
etc...
为了改善这两列之间的比较,我只想删除FIRST TWO点并留下第三个点。所以REPLACE transact只能在字符4到8上执行。有没有办法在服务器端执行此操作?
需要考虑的一些事项:
如果需要更多信息,请在下方发表评论,以便我可以编辑我的问题!
答案 0 :(得分:1)
我不理解您对STUFF
的逆境,以下情况似乎可以正常工作:
DECLARE @Start INT = 4,
@End INT = 9,
@Replace NCHAR(1) = '.';
SELECT s = STUFF(t.String,
@Start,
@End - @Start,
REPLACE(SUBSTRING(t.String, @Start, @End - @Start), @Replace, '')
)
FROM (VALUES
('132.105.213.000'),
('452.993.424.001'),
('436.345.332.002'),
('132105213.000'),
('452993424.001'),
('436345332.002')
) AS t (String);
基本上你是在指定的字符(SUBSTRING(t.String, @Start, @End - @Start)
)之间提取字符串,然后在这个提取上执行替换,并将剩下的内容填充到原始字符串中。
答案 1 :(得分:1)
试试这个。它将离开最后一个时期
DECLARE @t table(val varchar(50))
INSERT @t values
('132.105.213.000'),
('452.993.424.001'),
('436.345.332.002'),
('123')
SELECT replace(left(val, len(val) - len(rightval)), '.', '') + rightval
FROM @t t
OUTER APPLY
(SELECT right(val, charindex('.',reverse(val))) rightval) x
答案 2 :(得分:0)
您提供的答案帮助我找出解决方案,至少我认为这是一个很好的解决方案?这是查询的样子:
UPDATE myTable
SET myColumn = STUFF(myColumn, fromCharPosition, toCharPosition, REPLACE(SUBSTRING(myColumn, fromCharPosition, toCharPosition, charToReplace, charReplacement));
因此,对于我在问题中所做的示例,查询将如下所示:
UPDATE myTable
SET partNumber = STUFF(partNumber, 4, 8, REPLACE(SUBSTRING(partNumber, 4, 8), '.', ''));
再次感谢帮助这名受训者!