SQL server:替换指定范围内字符串中的字符
本文关键字:字符串 字符 范围内 server 替换 SQL | 更新日期: 2023-09-27 18:27:21
我有一个关于替换字符串中特定位置上的字符的问题。我的c#应用程序能够读取TXT、CSV、Excel、数据库等文件,并将它们导入网络上的SQL服务器(用户可以选择将文件导入到哪个服务器)。该应用程序用于将两个导入的文件相互比较。为了改进两个表之间的比较,我希望能够替换一些特定的字符。给你举个例子。第一个导入文件中的一列具有不带任何特殊字符的零件号。第二个导入文件也有一列与第一个导入文件具有相同的零件号,只有这些零件号每隔三个字符用一个点分隔。为了改进搜索,我从第二个导入的文件中删除了所有的点。这可以通过REPLACE交易轻松完成。查询(它是从我的c#应用程序中执行的,我不想制作存储过程,因为服务器可以根据用户的选择进行更改)将如下所示:
UPDATE myTable SET myColumn = REPLACE(myColumn , '.', '');
这个replace语句运行良好。然而,最困难的部分我想实现。假设第一个导入文件中的一列具有如下部件号:
132105213.000
452993424.001
436345332.002
etc...
第二个导入的文件有相同的零件号,只是它们看起来像这样:
132.105.213.000
452.993.424.001
436.345.332.002
etc...
为了改进这两列之间的比较,我只想去掉前两个点,留下第三个点。因此REPLACE事务应该只在字符4到8上执行。有什么方法可以在服务器端做到这一点吗?
需要考虑的一些事项:
- 我不想使用STUFF事务,因为一行中的每个字符串都可能不同,从而导致替换混乱
- 用户正在指定应该执行REPLACE事务的范围。例如,用户正在输入从字符位置4到位置8的替换
- 优选地,不进行存储过程,因为比较服务器可以根据用户的选择而不同
- 最好是SQL版本2005及更高版本。绝对最低的版本将是SQL Server 2008
如果需要更多信息,请在下面发表评论,这样我就可以编辑我的问题了!
我不理解你对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)
)之间的字符串,然后对该提取执行替换,并将剩下的内容填充回原始字符串中。
试试这个。它将离开最后一期
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
您提供的答案帮助我找到了解决方案,至少我认为这是一个好的解决方案?这就是查询的样子:
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), '.', ''));
再次感谢您帮助这位实习生!