在Oracle CASE语句中使用REPLACE
在Oracle CASE语句中使用REPLACE,oracle,Oracle,mytext是mytable中的一列,包含值('ABC123'、'ABC456'、'Alphabet 123'、'Alphabet 456'、'DEF123'…),但我希望它们都被格式化为'ABC123'。我不能理解正确的语法 UPDATE mytable SET mytext = CASE WHEN (mytext like 'Alphabet %') Then REPLACE(mytext, 'Alphabet ', 'ABC') WHEN (m
mytext
是mytable
中的一列,包含值('ABC123'、'ABC456'、'Alphabet 123'、'Alphabet 456'、'DEF123'…)
,但我希望它们都被格式化为'ABC123'
。我不能理解正确的语法
UPDATE mytable
SET mytext =
CASE
WHEN (mytext like 'Alphabet %') Then REPLACE(mytext, 'Alphabet ', 'ABC')
WHEN (mytext like 'Dookickey %') Then REPLACE(mytext, 'Doohickey ', 'DEF')
WHEN (mytext like 'Goofiness %') Then REPLACE(mytext, 'Goofiness ', 'GHI')
ELSE -- I want no other rows to be processed
END;
简单地使用:
UPDATE mytable SET mytext = REPLACE(mytext, 'Alphabet ', 'ABC')
如果不存在匹配项,则应按替换操作
将保持值不变。但是,这将涉及表中的所有行,并自行替换某些值——这至少不是很有效。此外,这将替换世界字母表
,即使不在字符串开头
如果您需要更健壮的东西,您应该添加一个过滤器:
UPDATE mytable SET mytext = REPLACE(mytext, 'Alphabet ', 'ABC')
WHERE mytext LIKE 'Alphabet %'
看
由于问题被编辑为支持多个替换字符串,因此确实可以使用
CASE
语句:
UPDATE mytable
SET mytext =
CASE
WHEN (mytext LIKE 'Alphabet %') THEN REPLACE(mytext, 'Alphabet ', 'ABC')
WHEN (mytext LIKE 'Dookickey %') THEN REPLACE(mytext, 'Dookickey ', 'DEF')
WHEN (mytext LIKE 'Goofiness %') THEN REPLACE(mytext, 'Goofiness ', 'GHI')
ELSE mytext
-- ^^^^^^
-- let unchanged
END;
看
与我的第一个解决方案一样,这将涉及表中的所有行。和以前一样,您可以使用过滤器来避免这种情况。在这种情况下,不再需要ELSE
子句(因为不匹配的行保持不变):
请参见您可以在CASE语句中使用SUBSTR函数检查前N个字符 您可能需要调整要比较的字符数:在本例中,大小写最多只匹配前8个字符:
select CASE SUBSTR("FIELD1", 1, 8)
-- 12345678
WHEN 'OLD_TEXT' THEN REPLACE("FIELD1", 'OLD_TEXT', 'NEW_TEXT')
WHEN 'ALPHABET' THEN REPLACE("FIELD1", 'ALPHABET', 'ABC')
ELSE "FIELD1" -- For all other values, leave unchanged
END
from
(
select
'OLD_TEXT1' "FIELD1"
FROM DUAL
UNION
select
'OLD_TEXT2' "FIELD1"
FROM DUAL
UNION
select
'ALPHABET' "FIELD1"
FROM DUAL
UNION
select
'DNR1' "FIELD1"
FROM DUAL
UNION
select
'DNR2_DO_NOT_REPLACE' "FIELD1"
FROM DUAL
) ;
updatemytable SET mytext=REPLACE(mytext,'Alphabet,'ABC')
?您可以选择where子句作为第二个选项。@Patrick我同意您的意见。例如,我会保留第一个解决方案,以便快速更新测试表。但对于生产代码,我只会使用第二种形式。谢谢。。。我不清楚我为什么要使用案例陈述。在帮助下,我更新了我的帖子,以反映我正在尝试的操作。。。mytext中的值比我最初透露的要多得多。谢谢您的回复。@mfrancis检查我的更新。你非常接近解决方案!谢谢你,西尔文。。。我今晚可以睡觉:)
select CASE SUBSTR("FIELD1", 1, 8)
-- 12345678
WHEN 'OLD_TEXT' THEN REPLACE("FIELD1", 'OLD_TEXT', 'NEW_TEXT')
WHEN 'ALPHABET' THEN REPLACE("FIELD1", 'ALPHABET', 'ABC')
ELSE "FIELD1" -- For all other values, leave unchanged
END
from
(
select
'OLD_TEXT1' "FIELD1"
FROM DUAL
UNION
select
'OLD_TEXT2' "FIELD1"
FROM DUAL
UNION
select
'ALPHABET' "FIELD1"
FROM DUAL
UNION
select
'DNR1' "FIELD1"
FROM DUAL
UNION
select
'DNR2_DO_NOT_REPLACE' "FIELD1"
FROM DUAL
) ;