Удалить спецсимволы из строки oracle
Поле содержит специальные символы, такие как 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 :
Читайте также: