2014-10-22 86 views
1

我有一個關於替換字符串中特定位置上的字符的問題。我的c#應用程序能夠讀取TXT,CSV,Excel,數據庫等文件,並將它們導入到網絡上的SQL服務器(用戶可以選擇導入文件的服務器)。該應用程序是比較兩個導入的文件與彼此。爲了改善兩個表格之間的比較,我希望能夠替換一些特定的字符。給你舉個例子。第一個導入文件中的一列有部件號,沒有任何特殊字符。第二個導入的文件也有一個與第一個導入文件具有相同部件編號的列,但只有那些部分編號在每第三個字符上用點分隔。爲了改進搜索,我從第二個導入文件中刪除所有點。這可以通過REPLACE事務輕鬆完成。查詢(也就是從我的C#應用​​程序exectuded,我不想做一個存儲過程,因爲服務器可以通過用戶的選擇而改變)看起來就像這樣:SQL服務器:從指定範圍內的字符串替換字符

UPDATE myTable SET myColumn = REPLACE(myColumn , '.', ''); 

這REPLACE語句是工作只是精細。然而我想要達到的困難部分。可以說,在第一個導入文件列有partnumbers,看起來像這樣:

5213.000 
452993424.001 
436345332.002 
etc... 

而第二個導入的文件具有相同的partnumbers只有他們是這樣的:

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.

如果需要更多信息,請在下面發表評論,以便我可以編輯我的問題!

+0

你只需要刪除位置4和8的字符?列總是有相同的長度嗎?我不明白你不喜歡解決問題的理由 – 2014-10-22 09:56:37

回答

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), '.', '')); 

再次感謝幫助了這個實習生!

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'), 
      ('5213.000'), 
      ('452993424.001'), 
      ('436345332.002') 
     ) AS t (String); 

基本上你是提取(SUBSTRING(t.String, @Start, @End - @Start))指定的字符之間的字符串,然後進行更換此提取並填充原始字符串中剩下的內容。

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