2013-10-18 72 views
1

如何替換表中的字符集?替換sql查詢中的字符集

ColumnA 
%%1234UIT 
!!1234TTT 
[email protected]@PPP 

目前我使用

`replace(replace(replace([BLOCK_NAME],'%%',''),'!!',''),'@@',''),1,LEN(BLOCK_NAME)-1` 
OR 
replace(replace(replace(substring([BLOCK_NAME],1,LEN(BLOCK_NAME)-1),'**',''),'##',''),'$$','') 
Expected OUTPUT: 
1234UIT 
123TTT 
678PPP 
+0

您是否嘗試刪除所有非數字字符? – unlimit

+0

預期輸出是什麼?你顯示的表達不完整 - 看起來你已經剝離了一個'SUBSTRING'調用?因爲你的表達式當前是'<嵌套替換>,數字,數字' –

+0

@unlimit不只是那些指定的字符。 – kinkajou

回答

1

這應該對你的問題的工作,它會從記錄中的所有非數字字符。你可以創建一個sql函數從你的查詢中調用。

WHILE PATINDEX('%[^0-9]%', @strText) > 0 
BEGIN 
    SET @strText = STUFF(@strText, PATINDEX('%[^0-9]%', @strText), 1, '') 
END 
RETURN @strText 
1

使用創建的功能

SELECT 
    dbo.fnRemoveNonNumericCharacters(BLOCK_NAME) 
FROM 
    YourTable 

OR

;WITH T as(
    SELECT STUFF(BLOCK_NAME, PATINDEX('%[^a-z0-9]%', BLOCK_NAME), 1, '') BLOCK_NAME from YourTable 
    UNION ALL 
    SELECT STUFF(BLOCK_NAME, PATINDEX('%[^a-z0-9]%', BLOCK_NAME), 1, '') BLOCK_NAME from T where PATINDEX('%[^a-z0-9]%', BLOCK_NAME) > 0 
) 
select 
    * 
from 
    T 
where PATINDEX('%[^a-z0-9]%', BLOCK_NAME) = 0 
請參閱 how to remove non-numeric/non-alphanumeric characters from string

CREATE FUNCTION [fnRemoveNonNumericCharacters](@strText VARCHAR(1000)) 
RETURNS VARCHAR(1000) 
AS 
BEGIN 
    WHILE PATINDEX('%[^a-z0-9]%', @strText) > 0 
    BEGIN 
     SET @strText = STUFF(@strText, PATINDEX('%[^a-z0-9]%', @strText), 1, '') 
    END 
    RETURN @strText 
END 

選擇數據

我更喜歡使用CTE而不使用用戶定義函數的第二種方法。

1

您可以創建一個功能:

CREATE FUNCTION [dbo].[fn_RemoveCharacters] 
(
    @Str NVARCHAR(MAX), 
    @MatchExpression VARCHAR(255) 
) 
RETURNS NVARCHAR(MAX) 
AS 
BEGIN 
    SET @MatchExpression = '%['[email protected]+']%' 

    WHILE PatIndex(@MatchExpression, @Str) > 0 
     SET @Str = Stuff(@Str, PatIndex(@MatchExpression, @Str), 1, '') 

    RETURN @Str 

END 

Go 

,然後將其稱爲:

SELECT [dbo].[fn_RemoveCharacters](ColumnA, '%%[email protected]@') as ColumnA 
from table1 

希望這有助於!