我正在使用REPLACE
语句替换我的列中的某些字符串。
update USER_DEFINED_DATA_SETS
set DefaultValue = replace(DefaultValue, 'Area', 'Area_123')
大部分时间都可以正常工作。但是,如果我的Area
列中包含Area_Description
和DefaultValue
数据,则会将其替换为Area123
和Area_123_Description
。
Area
和Area_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或任何其他场景。
答案 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