这有点困难,因为它需要不区分大小写(例如iIi 或tpT)。通常,您只需使用 UPPER() 但您想保留其余列的大小写。它还必须替换许多不同的“不正确”字母。最后,您不希望看到像xxxtpt 这样的东西,如果您不能按空格(因为它可能在开头或结尾),这很困难。我不确定你的最终目标是什么。我能想到两个:
- 您只需要一个查询来正确格式化结果。
- 您希望更新任何包含此内容的值。
无论哪种方式,这是我能想到的最简单的解决方案(尽管是补救措施)。您必须考虑所有不正确的大小写组合(例如:tpt, tpT, tPt, tPT, Tpt, TPt)。这有点蛮力,但由于缺乏时间和简单性(尤其是在少数情况下),这会起作用:
代码:
Select
Trim(
Replace(
Replace(
Replace(
Replace(
Replace(
--note the ' ' are added so we can search for a isolated instance of
--' tpt ' at the beginning or end of lines, as well as inbetween
-- these space get Trim()'d at in the end of processing everything.
Replace(' ' || test_t.text || ' ', ' tpt ', ' TPT ')
, ' tpT ', ' TPT ')
, ' tPt ', ' TPT ')
--etc...
, ' iii ', ' III ')
--etc...
, ' Iii ', ' III ')
, ' IIi ', ' III ')
)
as text
--poor man's way of creating test tables
From
(
Select 'tpt Broker' as text From dual UNION ALL
Select 'Mark iii' as text From dual UNION ALL
Select 'Davidtpt' as text From dual
) test_t
结果:
TPT Broker
Mark III
Davidtpt
这几乎是穷人的方式。如果这是一个长期问题,我确信有更好的解决方案,但如果您的数据清理很容易,这可能会奏效。您也可以尝试使用REGEXP_REPLACE,或INSTR 的组合。如果我想到更好的东西,我会更新这篇文章。
编辑:
喂,我知道一定有更好的方法。使用 REGEXP_REPLACE 简化了很多。我无法使“不区分大小写”的查询起作用(可能忽略了某些东西)。相同的方法,但这里是一个真正体面的解决方案:
Select
Trim(
REGEXP_REPLACE(
REGEXP_REPLACE(
' ' || text || ' ' , ' [tT][pP][tT] ', ' TPT ')
, ' [iI][iI][iI] ', ' III ')
) as text
From
(
Select 'tPt Broker' as text From dual UNION ALL
Select 'Mark iii' as text From dual UNION ALL
Select 'Davidtpt' as text From dual
) test_t