这有些困难,因为它需要不区分大小写(例如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
一个有趣的挑战。我将交叉连接到查找表并使用自定义聚合函数来执行替换。有点麻烦,也许有人想出了一些聪明... –
严格地说,你已经打破了1NF。我会研究如何规范化数据库(将字段拆分为原子组成部分)。之后,你的任务应该可以通过一个相当简单的JOIN来实现。 –