替代替换

时间:2015-12-24 06:23:50

标签: sql

我正在使用REPLACE语句替换我的列中的某些字符串。

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

大部分时间都可以正常工作。但是,如果我的Area列中包含Area_DescriptionDefaultValue数据,则会将其替换为Area123Area_123_Description

AreaArea_Description不同。我想仅替换Area而不是Area_Description

样本数据

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

在所有上述值中,只有第一行,即DefaultValue = Area应更改为Area123。休息一切都不应该改变。 此外,我不能在我的替换语句中放置像WHERE DeaultValue ='Area'这样的where子句,因为我需要这样做才能用于所有其他场景,例如Equipment或任何其他场景。

3 个答案:

答案 0 :(得分:3)

您可以在WHERE查询中添加UPDATE条件,将替换限制为仅DefaultValue列以Area开头或结尾,或包含{{ 1}}作为一个单独的词。

Area

答案 1 :(得分:0)

oracle 11g及以上。

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

结果:

Area
-------------------------
Area_123 Area_Description

答案 2 :(得分: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