Удалить спецсимволы из строки oracle

Обновлено: 07.07.2024

Поле содержит специальные символы, такие как pipe, returns, * и ( пример:

Теперь мне нужен оператор select, который удаляет все специальные символы, и мой результат должен быть

это приведет к удалению любых специальных символов ascii и * Но результат был:

Как удалить "(MBA) " из имен?

2 ответа

Ищу запрос SQL, который возвращает количество всех специальных символов, используемых в определенном столбце. Предположим, что в столбце есть 5 строк, и каждая из них использует два специальных символа. Я ищу какой-то запрос, который дает 10 в результате. Я пытался получить строки специальных.

Есть ли простой способ в Oracle избежать специальных символов в операторе SQL? (т. е.%, &, ') я видел эту ссылку в отношении ручного экранирования символов, но я подумал, что Oracle, возможно, предоставил более простой способ сделать это. Примечание: я генерирую динамические операторы SQL.

Для приведенных примеров данных будет работать приведенный ниже запрос.

Если я правильно понимаю, вы можете использовать regexp_replace() . Я бы подошел к этому в два этапа:

Первый удаляет часть в скобках. Второй сохраняет только буквенно-цифровые значения.

Похожие вопросы:

Ищем запрос SQL в ORACLE, который возвращает количество всех специальных символов, используемых в определенном столбце. Предположим, что в столбце есть 5 строк, и каждая из них использует два.

код sql или функция для удаления всех специальных символов из определенного столбца таблицы. :a oracle код для удаления всех специальных символов из столбца .for пример ABC D.E.F так что это должно.

Ищу запрос SQL, который возвращает количество всех специальных символов, используемых в определенном столбце. Предположим, что в столбце есть 5 строк, и каждая из них использует два специальных.

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

Как избежать специальных символов шаблона регулярного выражения в Oracle? Например мне нужна функция которая переводит some.string[with(special)reg-exp]characters к.

Как удалить пробелы и специальные символы из строки? Я не мог найти ни одного ответа, пока гуглил. Было много связанных с другими языками, но не C. Большинство из них упоминали использование regex.

Мне нужно удалить все символы из строки, кроме цифр и специальных символов. Пример asdasd 289(222):310 должно привести к 289(222):310 . Как мне это сделать ?

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

У меня есть следующий запрос: SELECT * FROM PRODUCTS WHERE REDUCTION LIKE '50%' Я должен использовать предложение LIKE. Этот запрос должен выполняться как на Oracle, так и на SQL Server. Теперь есть.

Как вариант решения рассматривала что-то типа

Я не совсем понял твое объяснение, как ни силился. Паттерн тут по всякому матчит всю строку, оба паттерна захватывают строки одинаковой длинны. Единственный жадный квантификатор, который ты оставил - в хвосте. Но так вообще в паттерне у нас используется группа, которая имеет свой паттерн с единственным квантификатором, который ленив, за которым жадный не следует.

Zloxa, числа трех-четырех значные.

Я не совсем понял твое объяснение, как ни силился. Паттерн тут по всякому матчит всю строку, оба паттерна захватывают строки одинаковой длинны. Единственный жадный квантификатор, который ты оставил - в хвосте. Но так вообще в паттерне у нас используется группа, которая имеет свой паттерн с единственным квантификатором, который ленив, за которым жадный не следует.

Жадность лучше показать так(ну или как в википедии хотябы)

В первом ищем 20 цифр, а потом символ (_), тогда выводим эти 20 цифр
во втором взять число первую от (_) до (_)
в третьем взять число после (_) и до (.)

В первом ищем 20 цифр, а потом символ (_), тогда выводим эти 20 цифр
во втором взять число первую от (_) до (_)
в третьем взять число после (_) и до (.)

REGEXP_SUBSTR(исходная_строка, шаблон[, позиция [, вхождение [,параметр_сопоставления]]])

исходная_строка поддерживает символьные типы данных (CHAR, VARCHAR2, CLOB, NCHAR, NVARCHAR2 и NCLOB, но не LONG)
шаблон регулярное выражение

позиция позиция, с которой необходимо начинать поиск

вхождение по умолчанию имеет значение 1

REGEXP_SUBSTR(исходная_строка, шаблон[, позиция [, вхождение [,параметр_сопоставления]]])

исходная_строка поддерживает символьные типы данных (CHAR, VARCHAR2, CLOB, NCHAR, NVARCHAR2 и NCLOB, но не LONG)
шаблон регулярное выражение

позиция позиция, с которой необходимо начинать поиск

вхождение по умолчанию имеет значение 1

В первом ищем 20 цифр, а потом символ (_), тогда выводим эти 20 цифр
во втором взять число первую от (_) до (_)
в третьем взять число после (_) и до (.)

В первом ищем 20 цифр, а потом символ (_), тогда выводим эти 20 цифр
во втором взять число первую от (_) до (_)
в третьем взять число после (_) и до (.)

В посте рассматриваются однострочные функции SUBSTR и INSTR, работающие с символьными данными.

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

Функции манипулирования символами используются для извлечения, преобразования и форматирования символьных строк. К этому классу относятся функции CONCAT, LENGTH, LPAD, RPAD, TRIM, REPLACE и рассматриваемые нижу функции SUBSTR и INSTR.

Функция SUBSTR принимает три параметра и возвращает строку, состоящую из количества символов, извлеченных из исходной строки, начиная с указанной начальной позиции:

SUBSTR (строка, начальная позиция, количество символов).

В приведенном примере извлекаются символы с первой по четвертую позиции из значений колонки last_name. Для сравнения выводятся исходные значения колонки last_name.


Функция INSTR возвращает число, представляющее позицию в исходной строке, начиная с заданной начальной позиции, где n-ное вхождение элемента поиска начинается:

INSTR (строка, элемент поиска, [начальная позиция], [n-ное вхождение элемента поиска]

Следующий запрос показывает позицию строчной буквы a для каждой строки колонки last_name. Если в строке встречаются два или более символов a, то будет отображена позиция первого/начального из них. Для сравнения и анализа выводятся исходные значения колонки.


Если необходимо также отобразить позицию заглавной буквы А в фамилии, то надо предварительно перевести все символы фамилии в строчные, используя вложенную функцию LOWER. Запрос выглядит следующим образом:


Как видно из результата, теперь позиция заглавной буквы A тоже определяется, например, для Abel, Ande, Atkinson, Austin возвращается значение 1.

В посте приведен пример совместного применения таких функций, как LENGTH, SUBSTR и INSTR.

в настоящее время мы переносим одну из наших баз данных oracle в UTF8, и мы нашли несколько записей, которые близки к пределу 4000 байт varchar. Когда мы пытаемся перенести эти записи, они терпят неудачу, поскольку они содержат символы, которые становятся многобайтовыми символами UF8. Что я хочу сделать в PL / SQL, это найти эти символы, чтобы увидеть, что они такое, а затем либо изменить их, либо удалить.

Я хотел бы сделать :

но Oracle не реализует [: ascii:] класс символов.

есть ли простой способ сделать то, что я хочу сделать?

в однобайтовой кодировке, совместимой с ASCII (например, Latin-1), символы ASCII-это просто байты в диапазоне от 0 до 127. Так что вы можете использовать что-то вроде [\x80-\xFF] для обнаружения символов, отличных от ASCII.

если вы используете ASCIISTR функция для преобразования Юникода в литералы формы \nnnn , тогда вы можете использовать REGEXP_REPLACE чтобы удалить эти литералы, вот так.

. где field и table-ваши имена полей и таблиц соответственно.

Я думаю, что это будет делать трюк:

Я бы не рекомендовал его для производственного кода, но это имеет смысл и, кажется, работает:

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

создайте функцию PLSQL для получения входной строки и возврата varchar2.

в функции PLSQL выполните asciistr () вашего ввода. PLSQL потому, что это может вернуть строку длиннее 4000, и у вас есть 32K, доступный для varchar2 в PLSQL.

эта функция преобразует символы, отличные от ASCII, для обозначения \xxxx. Так что вы можете использовать регулярные выражения, чтобы найти и удалить их. Затем верните результат.

выбор может выглядеть следующим образом:

У меня была аналогичная проблема, и я написал об этом в блоге здесь. Я начал с регулярного выражения для Альфа-цифр, затем добавил несколько основных знаков препинания, которые мне понравились:

я использовал дамп с вариантом 1016, чтобы выдать шестнадцатеричные символы, которые я хотел заменить, которые я мог бы использовать в utl_raw.cast_to_varchar2.

Я нашел ответ здесь:

затем запустите это, чтобы обновить данные

ответ, данный Франсиско Hayoz является лучшим. Не используйте функции pl/sql, если sql может сделать это за вас.

вот простой тест в Oracle 11.2.03

и "rep 127-255" - это

Тип=1 Лен=30: 226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255

i.e по какой-то причине эта версия Oracle не заменяет char(226) и выше. С помощью '['|/chr(127)||'-'||chr (225)//'] ' дает желаемый результат. Если вам нужно заменить другие символы, просто добавьте их в регулярное выражение выше или используйте вложенную replace|regexp_replace, если замена отличается " (нулевая строка).

Спасибо, это работает для моих целей. Кстати, в приведенном выше примере отсутствует одинарная кавычка.

REGEXP_REPLACE (СТОЛБЕЦ, ' [^'|/CHR (32) || '-' || CHR (127) || ']', ' '))

Я использовал его в функции переноса слов. Иногда во входящем тексте была встроенная новая строка/ NL / CHR(10) / 0A, которая все испортила.

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

механизм регулярных выражений Oracle будет соответствовать определенным символам из диапазона Latin-1: это относится ко всем символам, которые похожи на символы ASCII, такие как Ä->A, Ö->O, Ü->U и т. д., так что [A-Z] - это не то, что вы знаете из других сред, таких как, скажем, Perl.

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

другой подход: вместо того, чтобы вырезать часть содержимого полей, вы можете попробовать функцию SOUNDEX, при условии, что ваша база данных содержит только европейские символы (т. е. латинские-1). Или вы просто пишете функцию, которая переводит символы из диапазона Latin-1 в похожие символы ASCII, такие как

конечно только для текстовых блоков, превышающих 4000 байт при преобразовании в UTF-8.

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

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