2015-12-24 205 views
2

我使用REPLACE語句來替換我的列中的某個字符串。替代替換

update USER_DEFINED_DATA_SETS 
set DefaultValue = replace(DefaultValue, 'Area', 'Area_123') 

它在大多數時間都能正常工作。但是,如果我有我的DefaultValueAreaArea_Description數據,它取代了以Area123Area_123_Description

AreaArea_Description是不同的。我只想替換Area而不是Area_Description

示例數據

Sno  DefaultValue 
1  Area 
2  Area_Description 
3  Area123 
4  Equipment 
5  Equipment_Name 

所有上述值僅第一行即默認值=面積應該改變到Area123中。休息一切都不應該改變。 另外我不能在我的替換語句中放置WHERE DeaultValue ='Area'這樣的where子句,因爲我需要這樣的設置或其他任何其他場景。

+0

如果您可以添加一些示例數據(包括某些行不應該發生替換,某些應該出現的位置以及目前有問題的位置)以及您期望的重新生成sults。 –

+1

但是,如果我正確理解您的示例,則會出現此類問題,因爲您正在將多個數據填充到單個列中。損壞的數據模型通常會造成具有挑戰性的查詢 –

+0

「區域」(必須替換的部分)是否可以在字符串中多次? –

回答

3

您可以添加WHERE條件,你UPDATE查詢來限制更換隻能出現在DefaultValue列開頭或結尾Area,或含有Area作爲一個獨立的單詞。

UPDATE USER_DEFINED_DATA_SETS 
SET DefaultValue = REPLACE(DefaultValue, 'Area', 'Area_123') 
WHERE DefaultValue LIKE 'Area' OR 
     DefaultValue LIKE 'Area ' OR 
     DefaultValue LIKE ' Area ' OR 
     DefaultValue LIKE ' Area' 
+0

也許更好WHERE默認值NOT LIKE「%Area_123%」 – gsharp

+1

@gsharp我正在考慮這種做法,可是轉念一想,也許有可能是除了所示的其他假陽性病例。我假設沒有包含「Area」這個詞的空白的誤報。 –

+0

好點@Tim :) – gsharp

0

oracle 11g及以上。

SELECT REGEXP_REPLACE('Area Area_Description', 
         '(^|[^[:alnum:]_])Area($|[^[:alnum:]_])', 
         '\1Area_123\2') "Area" 
FROM DUAL; 

結果:

Area 
------------------------- 
Area_123 Area_Description 
+1

我們知道他在使用Oracle 11g嗎? –

+0

不,我們不這樣做,因爲它是一個* generic *問題,對於'oracle'用戶來說,這個答案對'*'有用。 – klashxx

+1

同意。藉助正則表達式函數的力量,他的問題更易於管理。 –

0

只是爲了它的地獄,我認爲這應該只更換不字母,數字兩側的區域或下劃線 - 改變圖形的其他規則:

--Ends with 
UPDATE USER_DEFINED_DATA_SETS SET DefaultValue = 
SUBSTRING(DefaultValue, 1, LEN(DefaultValue) - LEN('Area')) + 'Area123' 
FROM USER_DEFINED_DATA_SETS 
WHERE DefaultValue LIKE '%[^A-Za-z0-9_]Area' 

--Starts with or equals 
UPDATE USER_DEFINED_DATA_SETS SET DefaultValue = 
'Area123' + SUBSTRING(DefaultValue, LEN('Area') + 1, 9999999999) 
FROM USER_DEFINED_DATA_SETS 
WHERE DefaultValue LIKE 'Area[^A-Za-z0-9_]%' 
OR DefaultValue = 'Area' 

--In the middle - potentially multiple times 
DECLARE @rowCount int SET @rowCount = 1 
WHILE(@rowCount > 0) 
BEGIN 
UPDATE USER_DEFINED_DATA_SETS SET DefaultValue = 
    SUBSTRING(DefaultValue, 1, PATINDEX('%[^A-Za-z0-9_]Area[^A-Za-z0-9_]%', DefaultValue)) + 
    'Area123' + 
    SUBSTRING(DefaultValue, PATINDEX('%[^A-Za-z0-9_]Area[^A-Za-z0-9_]%', DefaultValue) + 1 + LEN('Area'), 9999999999) 
FROM USER_DEFINED_DATA_SETS 
WHERE DefaultValue LIKE '%[^A-Za-z0-9_]Area[^A-Za-z0-9_]%' 
SET @rowCount = @@ROWCOUNT 
END