Oracle что быстрее like или instr

Обновлено: 04.07.2024

будет быстрее в Oracle, или не будет никакой разницы?

Предполагая, что целью является максимальная производительность, в идеале я бы выбрал SUBSTR(my_field,1,6) и создал бы индекс на основе функций для поддержки запроса.

Как отмечают другие, SUBSTR(my_field,1,6) не сможет использовать обычный индекс для MY_FIELD . Версия LIKE может использовать индекс, но оценки кардинальности оптимизатора в этом случае, как правило, довольно плохие, поэтому весьма вероятно либо не использовать индекс, когда это будет полезно, либо использовать индекс, когда сканирование таблицы будет предпочтительным. Индексирование фактического выражения даст оптимизатору гораздо больше информации для работы, так что вероятность того, что индекс будет выбран правильно, гораздо выше. Кто-то умнее меня может предложить способ использования статистики по виртуальным столбцам в 11g, чтобы дать оптимизатору лучшую информацию для запроса LIKE.

Если 6 - это переменная (т. е. иногда вы хотите искать первые 6 символов, а иногда хотите искать другое число), вы, вероятно, не сможете найти индекс на основе функций для поддержки этого запроса. В этом случае вам, вероятно, лучше справляться с капризами решений оптимизатора с формулировкой LIKE.

Из двух представленных вариантов определенно НРАВИТСЯ. Метод подстроки должен быть выполнен для всех строк в таблице. Использование LIKE позволит использовать индексы.

Чтобы проверить мой ответ, просто профилируйте результаты. Это должно быть ясно как день.

Если у вас есть индекс для my_field, то LIKE может быть быстрее. Сделайте свои собственные тесты.

Если у вас нет индекса , то нет никакой разницы. Потому что oracle выполняет полное сканирование таблицы и оценивает выражение для каждой строки. Вы можете поместить индекс в столбец, чтобы ускорить оба запроса.

Этот индекс более гибкий и ускоряет запрос с помощью лайков. Это будет работать для любого сравнения, начинающегося с символов и имеющего заполнитель (%) в конце. Oracle выполняет сканирование диапазона индекса, чтобы найти все подходящие строки.

Этот индекс ускоряет запрос с помощью substr. Но индекс очень особенный, чтобы сравнивать только первые 6 символов.

Если вы запрашиваете кусок, начинающийся посередине. Создание индекса на основе функций поможет.

Здесь действительно две проблемы:

  1. Для кого Oracle даст более точную оценку количества и стоимости?
  2. Какой метод является более гибким с точки зрения потенциальных методов доступа?

Это может варьироваться в зависимости от версии, но оба довольно просты в тестировании, и таким образом вы уверены, что у вас есть лучшая информация для вашей версии и ваших данных.

Запустите планы выполнения для обоих запросов, используя .

Вы можете увидеть разницу в плане выполнения, в зависимости от наличия индексов и т. д., но также сравните оценки количества элементов с фактическим результатом, который вы получите:

Один из двух методов может быть значительно более точным, чем другой.

Если ни один из них не является очень точным и этот запрос будет выполняться в течение нетривиального промежутка времени, тогда попробуйте использовать динамическую выборку для улучшения оценки, поскольку при неверной оценке количества элементов оптимизатор может выбрать метод неоптимального доступа в любом случае.

Что касается использования индекса, оба метода могут использовать метод доступа на основе индекса. Предикат LIKE, вероятно, более удобен для индексов и может использовать сканирование диапазона или быстрое сканирование полного индекса. Метод SUBSTR, безусловно, может использовать быстрое полное сканирование индекса, но будет ли оптимизатор рассматривать сканирование диапазона лучше всего тестировать на вашей собственной версии - я помню, что он не будет, но кто скажет, что substr (my_column, 1 , n) не будет признан частным случаем, если не сейчас, то в будущем?

Я бы описал оба. Но я бы предположил, что «LIKE» будет намного быстрее, потому что он использует двоичный поиск по индексу (если поле проиндексировано). Если вы используете метод SUBSTR, вы закончите полное сканирование таблицы, поскольку Oracle должна обрабатывать функцию строка за строкой.

Если ваша цель состоит в том, чтобы проверить, существует ли строка в столбце MySQL (типа "varchar", "text", "blob" и т. д.), который из следующих быстрее / эффективнее / лучше использовать, и почему?

или есть какой-то другой метод, который превосходит любой из них?

полнотекстовый поиск абсолютно будет быстрее, как отметил кибибу в комментариях выше.

в моих тестах, они выполняют точно такую же. Они оба нечувствительны к регистру, и обычно они выполняют сканирование полной таблицы, общее нет - нет при работе с высокопроизводительным MySQL.

Если вы не выполняете поиск префикса в индексированном столбце:

в этом случае, как только суффикс подстановочный знак намного быстрее.

MySQL - INSTR vs найти vs как vs и

для меня INSTR и найти выполняется быстрее всего:

в случае " переднего wilcard "(т. е. "как"%. "предикат), как это, по-видимому, имеет место здесь,INSTR и LIKE должны выполнять примерно то же самое.

когда Джокер не "передний подстановочный знак", подобный подход должен быть быстрее, если подстановочный знак не очень избирательный.

причина почему тип подстановочного знака и его избирательность имеют значение это предикат с INSTR () будет систематически результат сканирования таблицы (SQL не может делать никаких предположений о семантике INSTR), в результате чего SQL может использовать свое понимание семантики подобного предиката, чтобы, возможно, использовать индекс, чтобы помочь ему протестировать только уменьшенный набор возможных совпадений.

Как предложено в комментарии к самому вопросу,полнотекстовый индекс будет намного быстрее. Разница зависит от конкретного распределения слов в тексте, а также общего размера таблицы и т. д. но ожидайте что-нибудь от вдвое быстрее, может быть, в 10 раз быстрее.

возможный недостаток использования в полнотекстовом индексе, в дополнение к общим накладным расходам для создания такого индекса, заключается в том, что, если вы не очень осторожны в настройке этого индекса (например, определение списка стоп-слов, используя конкретный синтаксис поиска, чтобы избежать инфлективных форм и тому подобное. ), могут быть случаи, когда результаты, предоставленные FullText, не будут ожидаемыми. Например, поиск " пилы "(инструмента рубить дрова), можно получить много хитов для записей, включая глагол "видеть", в его различных спрягаемых формах.
Конечно, эти лингвистические функции полнотекстовых индексов обычно можно переопределить, а также можно считать, что такие функции фактически являются преимуществом, а не недостатком. Я просто упоминаю об этом здесь, так как мы сравниваем это с простой поиск по шаблону.

мало что можно добавить к тесту раззеда. Но, по-видимому, используя regexp нести гораздо тяжелее нагрузки, как сет указывает в своем комментарии.

следующие тесты предполагают, что вы установили query_caching до On в моем.ini

тесты

тайминги показывают среднюю производительность, из трех измерений (с очищенным кэшем периодически):

начальный: 0.0035 s
кэширование: 0.0005 s

начальный: 0.01 s
кэширование: 0.0004 s

результат

LIKE или INSTR определенно быстрее, чем REGEXP .

хотя и минимальная, разница во времени кэша, вероятно, достаточна для дальнейшего расследования.

в Вероятно настроенной системе MySQL полнотекстовое индексирование обычно должно быть всегда быстрее или, по крайней мере, на одном уровне с неиндексированным поиском. Поэтому используйте индексацию, особенно на длинных текстах на человеческом языке, независимо от прерывистого кода разметки.

Вроде нет. Oracle Text строит инвертированный индекс (т.е. список слов со ссылками на записи в которых они встречаются). Индексировать таким способом буквы нет смысла (как правило любая буква будет присутствовать в каждой строке). Индексировать нужно ключи, по которым будет выполняться поиск. А в текстах такими ключами обычно являются слова.

ИМХО, решение есть.
Нарезаем строку на фрагменты, длина которых <= типичной длины :a. Таким образом в строке всегда будет фрагмент начало которого является подстрокой :a.
И по фрагментам строк строим инвертированный индекс.
Для того чтобы найти записи, где строка содержит :a, нарезаем :a на фрагменты по тем же правилам, по которым нарезали строки в таблице. (Поскольку :a это не вся строка, то вариантов нарезания :a на фрагменты может быть несколько). Затем используя инвертированный индекс находим записи, в которых есть искомые фрагменты (они либо целиком совпадают с врагментами :a, либо начинаются на фрагмент :a) и среди них отбираем только те где строка like '%'||:a||'%'.

Понятно, эффективность такого подхода зависит от типичной длинны :a, искомых строк и способа фрагментирования (равными частями, слогами и т.п.).

Полезно так же сохранять наиболее часто используемые значения :a в инвертированном индексе, если это может уменьшить время повторного поиска по :a.

Режем "DEFGHI" на "DE" и "FGHI". Фрагмент "DE" это начало :a и он короче 5ти символов, он может не находиться в голове ключа, поэтому непригоден для поиска по индексу (можно сделть второй индекс, где буквы в фрагментах переставлены в обратном порядке и искать такие фрагменты в нём). Фрагмент "FGHI" может быть головой ключа, по нему и ищем.

Грубо говоря так
но чтобы индекс реально заработал нужно делать примерно так:

Тут chr(255) скользкое место.

Этот запрос вернёт нам ROWID строк, которые содержат подстроку 'FGHI'. Если их относительно немного, то дальнейшее уточнение str like '%'||:a||'%' не займёт много времени.

"DEFGHI" можно порезать еще 5ю способами. Их все нужно проверить.

Зачем конкретно мне нужен именно такой поиск не скажу - задание довольно бессмысленное (зато хорошооплачиваемое). Повторю только, что мне нужен обычный поиск подстроки, ни больше, ни меньше. Подстрока словом не является, к сожалению.

Символьные функции PL/SQL на примерах

Символьная функция получает в качестве параметра одно или несколько символьных значений и возвращает символьное и числовое значение. Если символьная функция возвращает символьное значение, оно всегда имеет тип VARCHAR2 (переменная длина) — кроме функций UPPER и LOWER . Эти функции преобразуют заданную строку к верхнему или нижнему регистру соответственно и возвращают значение фиксированной длины типа CHAR , если переданные в аргументах строки имели тип CHAR .

Краткая сводка строковых функций

Как упоминалось ранее, PL/SQL предоставляет в распоряжение программиста широкий набор мощных, высокоуровневых строковых функций для получения информации о строках и модификации их содержимого. Следующий список дает представление об их возможностях и синтаксисе. За полной информацией о конкретных функциях обращайтесь к справочнику Oracle SQL Reference.

  • ASCII(символ ) Возвращает числовой код (NUMBER) представления заданного символа в наборе символов базы данных.
  • ASCIISTR(строка1) Получает строку в любом наборе символов и преобразует ее в строку ASCII-символов. Все символы, отсутствующие в кодировке ASCII, представляются в форме \XXXX, где XXXX — код символа в Юникоде.
  • CHR(код)
    Возвращает символ типа VARCHAR2 (длина 1), соответствующий заданному коду. Функция является обратной по отношению к функции ASCII. У нее имеется разновидность, удобная при работе с данными в национальных наборах символов:

Возвращает символ типа NVARCHAR2 из национального набора символов.

  • COMPOSE(строка1)
    Получает строку символов в формате Юникода и возвращает ее в нормализованном виде. Например, ненормализованное представление 'a\0303' определяет символ ' a ' с тильдой cверху (то есть a). Вызов COMPOSE('a\0303') возвращает значение ' \00E3' — шестнадцатеричный код символа a в Юникоде.

В Oracle9i Release 1 функция COMPOSE могла вызываться только из SQL-команд; в программах PL/SQL она использоваться не могла. Начиная с Oracle9i Release2, функция COMPOSE также может использоваться в выражениях PL/SQL.

  • CONCAT(строка1, строка2)
    Присоединяет строку2 в конец строки1. Аналогичного результата можно добиться при помощи выражения строка1 || строка2. Оператор || намного удобнее, поэтому функция CONCAT используется относительно редко.
  • CONVERT(строка1, набор_символов)
    Преобразует строку из набора символов базы данных в заданный набор символов. При вызове также можно задать исходный набор символов:

CONVERT(строка1, конечный_набор, исходный_набор)

    DECOMPOSE(строка1)
    Получает строку в Юникоде и возвращает строку, в которой все составные символы разложены на элементы. Функция является обратной по отношению к COMPOSE . Например, вызов DECOMPOSE ('a') возвращает строку ' a

Существует две разновидности этой функции:

  • DECOMPOSE(строка1 CANONICAL)
    Выполняет каноническую декомпозицию; полученный результат может быть восстановлен вызовом COMPOSE . Используется по умолчанию.
  • DECOMPOSE(строка1)
    Декомпозиция выполняется в так называемом режиме совместимости. Восстановление вызовом COMPOSE может оказаться невозможным.

Функция DECOMPOSE , как и COMPOSE , не может напрямую вызываться в выражениях PL/SQL в Oracle9i Release 1; ее необходимо вызывать из инструкций SQL. Начиная с Oracle9i Release 2, это ограничение было снято.

Существует несколько разновидностей этой функции:

  • INSTR(строка1, строка2, начальная_позиция)
    Поиск строки2 в строке1 начинается с позиции, заданной последним параметром. По умолчанию поиск начинается с позиции 1, так что вызов INSTR(string1, string2, 1 ) эквивалентен вызову INSTR(string1, string2) .
  • INSTR(строка1, строка2, отрицательная_начальная_позиция)
    Смещение начальной позиции задается не от начала, а от конца строки1.
  • INSTR(строка1, строка2, начальная_позиция, n )
    Находит n-е вхождение строки2, начиная с заданной начальной позиции.
  • INSTR(строка1, строка2, отрицательная_начальная_позиция, n)
    Находит n-е вхождение строки2, начиная с заданной начальной позиции от конца строки1.

Функция INSTR рассматривает строку как последовательность символов. Ее разновидности INSTRB, INSTR2 и INSTR4 рассматривают строку как последовательность байтов, кодовых единиц (code units) или кодовых индексов (code points) Юникода соответственно. Разновидность INSTRC рассматривает строку как последовательность полных символов Юникода. Например, строка 'a\0303' , которая представляет собой разложенный эквивалент '\00E3', или a , рассматривается как один символ. Напротив, функция INSTR рассматривает 'a\0303 ' как последовательность из двух символов.

  • LEAST(строка1, строка2, . )
    Получает одну или несколько строк и возвращает строку, которая оказалась бы первой (то есть наименьшей) при сортировке входных строк по возрастанию. Также см. описание функции GREATEST , обратной по отношению к LEAST .
  • LENGTH(строка1)
    Возвращает количество символов в строке. Разновидности LENGTHB, LENGTH2 и LENGTH4 возвращают количество байтов, кодовых единиц (code units) или кодовых индексов (code points) Юникода соответственно. Разновидность LENGTHC возвращает количество полных символов Юникода, нормализованных по мере возможности (то есть с преобразованием 'a\0303 ' в '\00E3' ).

Функция LENGTH обычно не возвращает нуль. Вспомните, что Oracle рассматривает пустую строку ('') как NULL , поэтому вызов LENGTH ('') фактически эквивалентен попытке получить длину NULL ; ее результат тоже будет равен NULL . Единственное исключение встречается при применении LENGTH к типу CLOB . Тип CLOB может содержать 0 байт и при этом быть отличным от NULL . В этом единственном случае LENGTH возвращает 0.

  • LOWER(строка1)
    Преобразует все буквы заданной строки в нижний регистр. Функция является обратной по отношению к UPPER . Тип возвращаемого значения соответствует типу входных данных ( CHAR ,VARCHAR2, CLOB ). Также см. NLS_LOWER .
  • LPAD(строка1, итоговая_длина)
    Возвращает значение строки1, дополненное слева пробелами до итоговой_длины . У функции существует следующая разновидность:
  • LPAD(строка1, итоговая_длина, заполнитель)
    Присоединяет достаточное количество полных или частичных вхождений заполнителя, чтобы общая длина строки достигла заданной итоговой_длины . Например, вызов LPAD ( 'Merry Christmas!', 25, 'Ho! ') вернет результат ' Ho! Ho! HMerry Christmas!'.
  • ?LTRIM(строка1)
    Удаляет пробелы с левого края строки1. Также см. описания функций TRIM (стандарт ISO) и RTRIM . У функции существует следующая разновидность:
  • LTRIM(строка1, удаляемый_набор)
    Удаляет любые символы, входящие в строку удаляемый_набор , от левого края строки1.
  • NCHR(код)
    Возвращает символ типа NVARCHAR2 (длина 1) , соответствующий заданному коду. Функция CHR с условием USING NCHAR_CS реализует ту же функциональность, что и NCHR .
  • NLS_INITCAP (строка1)
    Возвращает версию строки1, которая должна относиться к типу NVARCHAR2 или NCHAR , в которой первая буква каждого слова переводится в верхний регистр, а остальные буквы — в нижний. Функция возвращает значение типа VARCHAR2 . «Словом» считается последовательность символов, отделенная от остальных символов пробелом или символом, не являющимся буквенно-цифровым.

Вы можете задать порядок сортировки, влияющий на определение «первой буквы»:

  • NLS_INITCAP(строка1, 'NLS_SORT=правило_сортировки')
    В этой форме синтаксиса правило_сортировки представляет собой одно из допустимых названий правил сортировки, перечисленных в руководстве Oracle Database Globalization Support Guide, Appendix A, раздел «Linguistic Sorts».

Следующий пример показывает, чем функция INITCAP отличается от NLS_INITCAP :

В нидерландском языке последовательность символов « ? » рассматривается как один символ. Функция NLS_INITCAP распознает это обстоятельство при задании правила NLS_SORT и правильно преобразует символы слова « ?zer » («железо» по-нидерландски).

  • NLS_LOWER(строка1) и NLS_LOWER(строка1, 'NLS_SORT=правило_сортировки ') Возвращает строку1, преобразованную в нижний регистр по правилам заданного языка. О том, как NLS_SORT может повлиять на результат преобразования, рассказано в описании функции NLS_INITCAP .
  • NLS_UPPER(строка1) и NLS_UPPER(строка1, 'NLS_SORT=правило_сортировки') Возвращает строку1, преобразованную в верхний регистр по правилам заданного языка. О том, как NLS_SORT может повлиять на результат преобразования, рассказано в описании функции NLS_INITCAP .
  • NLSSORT(строка1) и NLSSORT(строка1, 'NLS_SORT=правило_сортировки ') Возвращает строку байтов, которая может использоваться для сортировки строкового значения по правилам заданного языка. Строка возвращается в формате RAW . Например, сравнение двух строк по правилам французского языка выполняется так: IF NLSSORT(x, 'NLS_SORT=XFRENCH') > NLSSORT(y, 'NLS_SORT=XFRENCH') THEN. Если второй параметр не указан, функция использует порядок сортировки по умолчанию, назначенный для сеанса. Полный список правил приведен в руководстве Oracle Database Globalization Support Guide, Appendix A, раздел «Linguistic Sorts».
  • REGEXP_COUNT, REGEXP_INSTR, REGEXP_LIKE, REGEXP_REPLACE, REGEXP_SUBSTR За описаниями этих функций, предназначенных для работы с регулярными выражениями, можно изучить эту статью.
  • REPLACE(строка1, искомая_строка, замена) Возвращает строку, полученную в результате замены всех вхождений искомой_строки в строке1 строкой замена. Функция REPLACE может использоваться для замены всех вхождений определенной подстроки в одной инструкции.
  • REPLACE(строка1, искомая_строка)
    Возвращает строку, полученную в результате удаления всех вхождений искомой_строки из строки1.
  • RPAD(строка1, итоговая_длина)
    Возвращает значение строки1, дополненное справа пробелами до итоговой_длины . У функции существует следующая разновидность:
  • RPAD(строка1, итоговая_длина, заполнитель)
    Присоединяет достаточное количество полных или частичных вхождений заполнителя, чтобы общая длина строки достигла заданной итоговой_длины . Вызов RPAD('Merry Christmas!', 25, 'Ho! ') вернет результат 'Merry Christmas! Ho! Ho!'.

Функция RPAD дополняет строку справа, а парная ей функция LPAD — слева.

  • RTRIM(строка1)
    Удаляет пробелы с правого края строки1. Также см. описания функций TRIM (стандарт ISO) и LTRIM . У функции существует следующая разновидность:
  • RTRIM(строка1, удаляемый_набор)
    Удаляет любые символы, входящие в строку удаляемый_набор , с правого края строки1.
  • SOUNDEX(строка1)
    Возвращает строку с «фонетическим представлением» аргумента.
    Пример:

При использовании функции SOUNDEX следует помнить несколько правил:

  • Значение SOUNDEX всегда начинается с первой буквы входной строки.
  • Возвращаемое значение генерируется только по первым пяти согласным в строке.
  • Для вычисления цифровой части SOUNDEX используются только согласные. Все гласные в строке, кроме начальных, игнорируются.
  • Функция SOUNDEX игнорирует регистр символов; для букв верхнего и нижнего регистра генерируются одинаковые значения SOUNDEX .

Функция SOUNDEX полезна для запросов, при которых точное написание значения в базе данных неизвестно или не может быть легко определенно.

Алгоритм SOUNDEX ориентирован на английский язык; в других языках он может работать плохо (или не работать вообще).

  • SUBSTR(строка1, начальная_позиция, длина)
    Возвращает подстроку из строки1, которая начинается с начальной_позиции и имеет заданную длину. Если количество символов до конца строки1 окажется меньше длины, возвращаются все символы от начальной позиции до конца строки. У функции существуют следующие разновидности:
  • SUBSTR(строка1, начальная_позиция)
    Возвращает все символы от начальной_позиции до конца строки1.
  • SUBSTR(строка1, отрицательная_начальная_позиция, длина)
    Начальная позиция подстроки отсчитывается от конца строки1.
  • SUBSTR(строка1, отрицательная_начальная_позиция)
    Возвращает последние ABS( отрицательная_начальная_позиция ) строки.

Функция SUBSTR рассматривает строку как последовательность символов. Ее разновидности SUBSTRB, SUBSTR2 и SUBSTR4 рассматривают строку как последовательность байтов, кодовых единиц (code units) или кодовых индексов (code points) Юникода соответственно. Разновидность SUBSTRC рассматривает строку как последовательность полных символов Юникода. Например, строка 'a\0303' , которая представляет собой разложенный эквивалент '\00E3' , или a , рассматривается как один символ. Напротив, функция SUBSTR рассматривает 'a\0303' как последовательность из двух символов.

  • TO_CHAR(национальные_символьные_данные)
    Преобразует данные из национального набора символов в эквивалентное представление в наборе символов базы данных. Также см. TO_NCHAR .

Функция TO_CHAR также может использоваться для преобразования даты/ времени и чисел в удобочитаемую форму.

  • TO_MULTI_BYTE(строка1)
    Преобразует однобайтовые символы в их многобайтовые эквиваленты. В некоторых многобайтовых кодировках, и прежде всего UTF-8, может существовать несколько вариантов представления одного символа. Скажем, в UTF-8 представление буквы 'G' может содержать от 1 до 4 байт. Для перехода от однобайтового представления к многобайтовому используется функция TO_MULTI_BYTE . Данная функция является обратной по отношению к TO_SINGLE_BYTE .
  • TO_NCHAR(символы_в_наборе_базы_данных)
    Преобразует данные из набора символов базы данных в эквивалентное представление в национальном наборе символов. Также см. TO_CHAR и TRANSLATE. USING.

Функция TO_NCHAR также может использоваться для преобразования даты/времени и чисел в удобочитаемую форму.

  • TO_SINGLE_BYTE(строка1)
    Преобразует многобайтовые символы в их однобайтовые эквиваленты. Функция является обратной по отношению к TO_MULTI_BYTE .
  • TRANSLATE(строка1, искомый_набор, набор_замены)
    Заменяет в строке1 каждое вхождение символа из искомого_набора соответствующим символом набора_замены . Пример:

Если искомый_набор содержит больше символов, чем набор_замены , «лишние» символы, не имеющие соответствия в наборе_замены , не включаются в результат. Пример:

Буква « d » удалена, потому что она присутствует в искомом_наборе , но не имеет эквивалента в наборе_замены . Функция TRANSLATE заменяет отдельные символы, а функция REPLACE — целые строки.

  • TRANSLATE(текст USING CHAR_CS) и TRANSLATE(текст USING NCHAR_CS)
    Преобразует символьные данные в набор символов базы данных ( CHAR_CS ) или в национальный набор символов ( NCHAR_CS ). Выходным типом данных будет VARCHAR2 или NVARCHAR2 в зависимости от того, выполняется ли преобразование к набору символов базы данных или национальному набору символов соответственно.

Функция TRANSLATE. USING входит в число функций SQL по стандарту ISO. Начиная с Oracle9i Release 1, можно просто присвоить значение VARCHAR2 переменной типа NVARCHAR2 , и наоборот — система неявно выполнит нужное преобразование. Если же вы хотите выполнить преобразование явно, используйте функции TO_CHAR и TO_NCHAR для преобразования текста в набор символов базы данных и национальный набор символов соответственно. Oracle рекомендует пользоваться указанными функциями вместо TRANSLATE. USING , потому что они поддерживают более широкий набор входных типов данных.

  • TRIM(FROM строка1)
    Возвращает строку, полученную в результате удаления из строки1 всех начальных и конечных пробелов. У функции существуют следующие разновидности:
  • TRIM(LEADING FROM . )
    Удаление только начальных пробелов.
  • TRIM(TRAILING FROM . )
    Удаление только конечных пробелов.
  • TRIM(BOTH FROM . )
    Удаление как начальных, так и конечных пробелов (используется по умолчанию).
  • TRIM (. удаляемый_символ FROM строка1)
    Удаление вхождений одного удаляемого_символа на выбор программиста.

Функция TRIM была включена в Oracle8i для обеспечения более полной совместимости со стандартом ISO SQL. Она сочетает в себе функциональность LTRIM и RTRIM , но отличается от них тем, что TRIM позволяет задать только один удаляемый символ, тогда как при использовании LTRIM и RTRIM можно задать набор удаляемых символов.

  • UNISTR(строка1)
    Возвращает строку1, преобразованную в Юникод; таким образом, функция является обратной по отношению к ASCIISTR . Для представления непечатаемых символов во входной строке можно использовать запись \XXXX, где XXXX — кодовый индекс символа в Юникоде. Пример:

Функция предоставляет удобный доступ ко всему набору символов Юникода, в том числе и к тем, которые не могут вводиться непосредственно с клавиатуры.

Читайте также: