2015-04-21 22 views
0

我有一張表,其中包含留在特定位置的家庭成員的詳細信息。由於這些是政府數據,因此有很多錯誤。就像在'houseno'一欄中,有兩個值'Ti 303'和'303'是相同的門牌號碼。我想比較SQL Server中同一列中的字母數字字符串

最後,我想Ti 303更新爲'303'。 (因爲這些是同住的家庭成員)

同樣,'P-101'和'P/101'是同一個houseno's,我希望它被轉換爲'P-101'或'P/101' 。我嘗試了差別,子串等,但現在使用我。請幫忙!

+0

發佈您嘗試過的查詢,樣本數據和預期輸出。得到答案的機會會增加。 –

+0

你只是想忽略不是數字的部分嗎?如果數字是第一個呢? –

+0

@ t-clausen.dk我不認爲這很容易,OP明確表示他希望在他的數據中保留「P」或「P /」。他需要對它進行規範化處理,但我認爲規則會變得更加模糊,然後簡單地提取數字。 –

回答

0

您應該使用REPLACE命令。對於兩個例子給出如下,你可以硬編碼:

select REPLACE('Ti 303','Ti ','') 
select REPLACE('P-101','P-','P/') 

你會在你的UPDATE命令中使用REPLACE而不是作爲一個SELECT明顯。

如果你有一個字符串列表替換列中的更新,那麼你可以把它們放到一個表中。然後在您的REPLACE命令中使用此命令來替換要替換的字符串模式。

+0

問題是我有數百萬行,它可以是'Ti 303'或'Br 405'或'P/1010'或任何其他東西。因此,不能硬編碼。我一定會製作另一張桌子,這樣我就可以有兩張相同列的表格進行比較。但問題是我無法手動從這樣一個大型數據庫中選擇所有的字符串。我正在尋找可以檢測到模式並相應更改的東西。 – user3077610

0

你只需要去掉字符來比較內容?

CREATE FUNCTION dbo.FN_GetNumberPart (@strMixedString VARCHAR(200)) 
RETURNS VARCHAR(200) 
AS 
BEGIN 
    DECLARE @NumberPart INT 
    -- Get the next non numeric character position 
    SET @NumberPart = PATINDEX('%[^0-9]%', @strMixedString) 
    -- While there are non numeric characters remaining 
    WHILE @NumberPart > 0 
     BEGIN 
     -- Remove the non numeric character from the string 
     SET @strMixedString = STUFF(@strMixedString, @NumberPart , 1, '') 
     -- Get the next non numeric character position 
     SET @NumberPart = PATINDEX('%[^0-9]%', @strMixedString) 
    END 
    -- Spit out the cleansed string 
    RETURN ISNULL(@strMixedString,0) 
END 
GO 

SELECT dbo.FN_GetNumberPart(HouseNo) 
from TblAddresses 
+0

更好的選擇是使用SQL CLR fn代替標準UDF,如上面顯示的FN_GetNumberPart。與一般的UDF相比,SQL CLR將會更快更高效。 – Karan

+0

你說得很對。任何想法使用什麼版本? –

+0

@SimonUK SQL Server 2012 – user3077610