Это немного сложно, так как оно должно быть нечувствительным к регистру (для таких вещей, как 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
. Если я подумаю о чем-то лучше, я обновлю этот пост.
EDIT:
Ой, я знал, что должен быть лучший способ. Использование 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. –