Альтернатива PHP функции STR_REPLACE MySQL. Sql replace пример
REGEXP_REPLACE ФУНКЦИЯ — Oracle PL/SQL •MySQL •SQL Server
В этом учебном пособии вы узнаете, как использовать функцию REGEXP_REPLACE Oracle/PLSQL с синтаксисом и примерами.
Описание
Функция Oracle/PLSQL REGEXP_REPLACE является расширением функции REPLACE. Эта функция, введенная в Oracle 10g, позволит вам заменить последовательность символов в строке другим набором символов, используя сопоставление шаблонов регулярных выражений.
Синтаксис
Синтаксис функции Oracle/PLSQL REGEXP_REPLACE :
REGEXP_REPLACE( string, pattern [, replacement_string [, start_position [, nth_appearance [, match_parameter ] ] ] ] )
Параметры или аргументы
stringСтрока для поиска. Это могут быть CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB или NCLOB.
patternШаблон. Регулярное выражение для сопоставления. Это может быть комбинацией следующих значений:
^ | Соответствует началу строки. При использовании match_parameter с m, соответствует началу строки в любом месте в пределах выражения. |
$ | Соответствует концу строки. При использовании match_parameter с m, соответствует концу строки в любом месте в пределах выражения. |
* | Соответствует нолю или более вхождений. |
+ | Соответствует одному или более вхождений. |
? | Соответствует нолю или одному вхождению. |
. | Соответствует любому символу, кроме NULL. |
| | Используется как «OR», чтобы указать более одной альтернативы. |
[ ] | Используется для указания списка совпадений, где вы пытаетесь соответствовать любому из символов в списке. |
[^ ] | Используется для указания списка nonmatching, где вы пытаетесь соответствовать любому символу, за исключением тех кто в списке. |
( ) | Используется для групповых выражений в качестве подвыражений. |
{m} | Соответствует m раз. |
{m,} | Соответствие как минимум m раз. |
{m,n} | Соответствие как минимум m раз, но не более n раз. |
\n | n представляет собой число от 1 до 9. Соответствует n-му подвыражению находящемуся в ( ) перед \n. |
[..] | Соответствует одному сопоставлению элемента, который может быть более одного символа. |
[::] | Соответствует классу символов. |
[==] | Соответствует классу эквивалентности |
\d | Соответствует цифровому символу. |
\D | Соответствует не цифровому символу. |
\w | Соответствует текстовому символу. |
\W | Соответствует не текстовому символу. |
\s | Соответствует символу пробел. |
\S | Соответствует не символу пробел. |
\A | Соответствует началу строки или соответствует концу строки перед символом новой строки. |
\Z | Соответствует концу строки. |
*? | Соответствует предыдущему шаблону ноль или более вхождений. |
+? | Соответствует предыдущему шаблону один или более вхождений. |
?? | Соответствует предыдущему шаблону ноль или одному вхождению. |
{n}? | Соответствует предыдущему шаблону n раз. |
{n,}? | Соответствует предыдущему шаблону, по меньшей мере n раз. |
{n,m}? | Соответствует предыдущему шаблону, по меньшей мере n раз, но не более m раз. |
replacement_stringНеобязательный. Соответствующие шаблоны в строке будут заменены на replace_string. Если параметр replacement_string опущен, то функция просто удаляет все совпадающие шаблоны и возвращает полученную строку.
start_positionНеобязательный. Это позиция в строке, откуда начнется поиск. Если этот параметр опущен, по умолчанию он равен 1, который является первой позицией в строке.
nth_appearanceНеобязательный. Это n-й вид шаблона в строке. Если этот параметр опущен, по умолчанию он равен 1, который является первым вхождением шаблона в строке. Если вы укажете 0 для этого параметра, все вхождения шаблона в строке будут заменены.
match_parameterНеобязательный. Это позволяет изменять поведение соответствия для условия REGEXP_REPLACE. Это может быть комбинацией следующих значений:
‘c’ | Выполняет чувствительное к регистру согласование. |
‘i’ | Выполняет не чувствительное к регистру согласование. |
‘n’ | Позволяет период символа (.) для соответствия символа новой строки. По умолчанию, период метасимволы. |
‘m’ | Выражение допускает, что есть несколько строк, где ^ это начало строки, а $ это конец строки, независимо от позиции этих символов в выражении. По умолчанию предполагается, что выражение в одной строке. |
‘x’ | Игнорируются символы пробелов. По умолчанию, символы пробелов совпадают, как и любой другой символ. |
Функция REGEXP_REPLACE возвращает строковое значение.
Примечание
- Если для параметра match_parameter имеются противоречивые значения, функция REGEXP_REPLACE будет использовать последнее значение.
- См. также функцию REPLACE.
Применение
Функция REGEXP_REPLACE может использоваться в следующих версиях Oracle/PLSQL:
- Oracle 12c, Oracle 11g, Oracle 10g
Пример совпадения с первым словом
Рассмотрим пример использования функции REGEXP_REPLACE для замены первого слова в строке.
Например:
SELECT REGEXP_REPLACE ('Bing is a great search engine.', '^(\S*)', 'Google') FROM dual; --Результат: 'Google is a great search engine.'
SELECT REGEXP_REPLACE ('Bing is a great search engine.', '^(\S*)', 'Google') FROM dual; --Результат: 'Google is a great search engine.' |
Этот пример вернет ‘Google is a great search engine.’, потому что начало совпадения в начале строки, как указано символом ^, а затем найдет первое слово в соответствии с (\S*). Затем функция заменит это первое слово на ‘Google’.
Пример совпадения цифр
Рассмотрим пример, как мы будем использовать функцию REGEXP_REPLACE для сопоставления шаблону цифровых символов.
Например:
SELECT REGEXP_REPLACE ('1, 4, и 10 числа для примера.', '\d', '@') FROM dual; --Результат: @, @, и @@ числа для примера.
SELECT REGEXP_REPLACE ('1, 4, и 10 числа для примера.', '\d', '@') FROM dual; --Результат: @, @, и @@ числа для примера. |
Этот пример заменит все числа в строке, как указано в шаблоне \d, на символ @.
Мы могли бы изменить наш шаблон для поиска только двухзначных чисел.
Например:
SELECT REGEXP_REPLACE ('1, 4, и 10 числа для примера', '(\d)(\d)', '@') FROM dual; --Результат: 1, 4, и @ числа для примера
SELECT REGEXP_REPLACE ('1, 4, и 10 числа для примера', '(\d)(\d)', '@') FROM dual;
--Результат: 1, 4, и @ числа для примера |
Этот пример заменит число, которое имеет две цифры, как указано в шаблоне (\d)(\d). В этом случае он пропустит числовые значения 2 и 5 и заменит 10 символом @.
Теперь рассмотрим, как мы будем использовать функцию REGEXP_REPLACE со столбцом таблицы для замены двухзначных чисел.Например:
SELECT REGEXP_REPLACE (address, '(\d)(\d)', 'Str') FROM contacts;
SELECT REGEXP_REPLACE (address, '(\d)(\d)', 'Str') FROM contacts; |
В этом примере мы заменим все двузначные значения поля address в таблице contacts на значение ‘Str’.
Пример сопоставления нескольких альтернатив.
Следующий пример, который мы рассмотрим, включает использование | шаблон. | шаблон используется как «ИЛИ», чтобы указать несколько альтернатив.
Например:
SELECT REGEXP_REPLACE ('AeroSmith', 'a|e|i|o|u', 'R') FROM dual; --Результат: ARrRSmRth
SELECT REGEXP_REPLACE ('AeroSmith', 'a|e|i|o|u', 'R') FROM dual; --Результат: ARrRSmRth |
Этот пример вернет ‘ARrRSmRth’, потому что он ищет первую гласную (a, e, i, o или u) в строке. Поскольку мы не указали значение match_parameter, функция REGEXP_REPLACE будет выполнять поиск с учетом регистра, что означает, что ‘A’ в ‘AeroSmith’ не будет сопоставляться.
Мы могли бы изменить наш запрос, чтобы выполнить поиск без учета регистра следующим образом:
SELECT REGEXP_REPLACE ('AeroSmith', 'a|e|i|o|u', 'R', 1, 0, 'i') FROM dual; --Результат: RRrRSmRth
SELECT REGEXP_REPLACE ('AeroSmith', 'a|e|i|o|u', 'R', 1, 0, 'i') FROM dual; --Результат: RRrRSmRth |
Теперь, поскольку мы указали match_parameter = ‘i’, запрос заменит ‘A’ в строке. На этот раз ‘A’ в ‘AeroSmith’ сопоставится с шаблоном. Заметим также, что мы указали 5-й параметр как 0, чтобы были заменены все вхождения.
Теперь рассмотри, как вы будете использовать эту функцию со столбцом.
Итак, допустим, у нас есть таблица contact со следующими данными:
1000 | AeroSmith |
2000 | Joy |
3000 | Scorpions |
Теперь давайте запустим следующий запрос:
SELECT contact_id, last_name, REGEXP_REPLACE (last_name, 'a|e|i|o|u', 'R', 1, 0, 'i') AS "New Name" FROM contacts;
SELECT contact_id, last_name, REGEXP_REPLACE (last_name, 'a|e|i|o|u', 'R', 1, 0, 'i') AS "New Name" FROM contacts; |
Запрос вернет следующие результаты:
1000 | AeroSmith | RRrRSmRth |
2000 | Joy | JRy |
3000 | Scorpions | ScRrpRRns |
Пример совпадений на основе параметра nth_occurrence
Следующий пример, который мы рассмотрим, включает параметр nth_occurrence. Параметр nth_occurrence позволяет вам выбрать, какое вхождение шаблона вы хотите заменить в строке.
Первое вхождение
Рассмотрим, как заменить первое вхождение шаблона в строке.
Например:
SELECT REGEXP_REPLACE ('Scorpions', 'a|e|i|o|u', 'Z', 1, 1, 'i') FROM dual; --Результат: ScZrpions
SELECT REGEXP_REPLACE ('Scorpions', 'a|e|i|o|u', 'Z', 1, 1, 'i') FROM dual;
--Результат: ScZrpions |
Этот пример заменит третий символ (‘e’) в ‘Scorpions’, потому что он заменяет первое вхождение гласного (a, e, i, o или u) в строке.
Второе вхождение
Затем мы выберем для второго вхождения шаблона в строку.
Например:
SELECT REGEXP_REPLACE ('Scorpions', 'a|e|i|o|u', 'Z', 1, 2, 'i') FROM dual; --Результат: ScorpZons
SELECT REGEXP_REPLACE ('Scorpions', 'a|e|i|o|u', 'Z', 1, 2, 'i') FROM dual;
--Результат: ScorpZons |
Этот пример заменит шестой символ (‘i’) в ‘Scorpions’, потому что он заменяет второе вхождение гласного (a, e, i, o или u) в строке.
Третье вхождение
Например:
SELECT REGEXP_REPLACE ('Scorpions', 'a|e|i|o|u', 'Z', 1, 3, 'i') FROM dual; --Результат: ScorpiZns
SELECT REGEXP_REPLACE ('Scorpions', 'a|e|i|o|u', 'Z', 1, 3, 'i') FROM dual;
--Результат: ScorpiZns |
Этот пример заменит седьмой символ (‘o’) в ‘Scorpions’, потому что он заменяет третье вхождение гласного (a, e, i, o или u) в строке.
oracleplsql.ru
sql - Функция SQL REPLACE, как заменить одну букву
Не то, чтобы я был большим поклонником процесса убийства производительности обработки подкатегорий, но мне кажется, что вы можете это сделать, просто изменив порядок:
replace(replace(cc.contype,'y','z'),'x','y') as ContractType,Это преобразует все символы y в z, прежде чем трансформировать символы x в y.
Если вы используете более общее решение, вы можете делать объединенные запросы, например:
select 'Signed: ' || cc.contype as ContractType wherecc.contype like 'C%' from wherever union all select 'Estimate: ' || cc.contype as ContractType where cc.contype like 'E%' from whereverне имея необходимости возиться с подстроками вообще (при небольшой стоимости префикса строки, а не ее модификации, и, конечно же, добавлении любых других необходимых условий). Обычно это будет намного эффективнее, чем функции в строке.
Некоторые СУБД будут выполнять эти подзапросы параллельно с эффективностью.
Конечно, идеальным решением является изменение вашей схемы, чтобы вам не приходилось обрабатывать под-столбцы. Разделите столбец contype на два, сохранив первый символ в contype_first и contype_rest.
Затем всякий раз, когда вы хотите получить полный contype:
select contype_first || contype_rest ...Для вашего текущего запроса вы можете использовать таблицу поиска:
lookup_table: first char(1) primary key description varchar(20)содержащий:
first description ----- ----------- C Signed: E Estimate:и запрос:
select lkp.description || cc.contype_rest from lookup_table lkp, real_table cc where lkp.first = cc.first ...Оба этих запроса, вероятно, будут стремительно быстрыми по сравнению с тем, который выполняет повторные замены строк в каждой строке.
Даже если вы не можете заменить один столбец двумя независимыми столбцами, вы можете по крайней мере создать два новых и использовать триггер insert/update, чтобы синхронизировать их. Это дает вам старый способ и новый улучшенный способ доступа к информации contype.
И хотя это технически нарушает 3NF, что часто приемлемо по соображениям производительности, при условии, что вы понимаете и уменьшаете риски (с помощью триггеров).
qaru.site
regex - Шаблон Regex внутри функции SQL Replace?
Вы можете использовать PATINDEX для поиска первого индекса возникновения шаблона (строки). Затем используйте STUFF, чтобы наполнить другую строку в соответствие шаблону (строке).
Прокрутите каждую строку. Замените все незаконные символы тем, что вы хотите. В вашем случае замените не числовое значение пустым. Внутренний цикл - это если у вас более одного незаконного символа в текущей ячейке цикла.
DECLARE @counter int SET @counter = 0 WHILE(@counter < (SELECT MAX(ID_COLUMN) FROM Table)) BEGIN WHILE 1 = 1 BEGIN DECLARE @RetVal varchar(50) SET @RetVal = (SELECT Column = STUFF(Column, PATINDEX('%[^0-9.]%', Column),1, '') FROM Table WHERE ID_COLUMN = @counter) IF(@RetVal IS NOT NULL) UPDATE Table SET Column = @RetVal WHERE ID_COLUMN = @counter ELSE break END SET @counter = @counter + 1 ENDВнимание! Это медленное! Наличие столбца varchar может повлиять. Поэтому использование LTRIM RTRIM может немного помочь. Несмотря на это, он медленный.
Кредит переходит на этот ответ на StackOverFlow.
ИЗМЕНИТЬ Кредит также отправляется на @srutzky
Изменить (by @Tmdean) Вместо того, чтобы делать одну строку за раз, этот ответ можно адаптировать к более основанному на множестве решения. Он по-прежнему выполняет итерацию максимального числа нечисловых символов в одной строке, поэтому он не идеален, но я думаю, что это должно быть приемлемым в большинстве ситуаций.
WHILE 1 = 1 BEGIN WITH q AS (SELECT ID_Column, PATINDEX('%[^0-9.]%', Column) AS n FROM Table) UPDATE Table SET Column = STUFF(Column, q.n, 1, '') FROM q WHERE Table.ID_Column = q.ID_Column AND q.n != 0; IF @@ROWCOUNT = 0 BREAK; END;Вы также можете повысить эффективность довольно много, если вы поддерживаете бит столбца в таблице, который указывает, было ли поле еще очищено. (NULL представляет "Неизвестный" в моем примере и должен быть столбцом по умолчанию.)
DECLARE @done bit = 0; WHILE @done = 0 BEGIN WITH q AS (SELECT ID_Column, PATINDEX('%[^0-9.]%', Column) AS n FROM Table WHERE COALESCE(Scrubbed_Column, 0) = 0) UPDATE Table SET Column = STUFF(Column, q.n, 1, ''), Scrubbed_Column = 0 FROM q WHERE Table.ID_Column = q.ID_Column AND q.n != 0; IF @@ROWCOUNT = 0 SET @done = 1; -- if Scrubbed_Column is still NULL, then the PATINDEX -- must have given 0 UPDATE table SET Scrubbed_Column = CASE WHEN Scrubbed_Column IS NULL THEN 1 ELSE NULLIF(Scrubbed_Column, 0) END; END;Если вы не хотите изменять свою схему, это легко адаптировать для хранения промежуточных результатов в переменной таблицы, которая применяется к фактической таблице в конце.
qaru.site
Альтернатива PHP функции STR_REPLACE MySQL
Привет. Сегодня мы рассмотрим как же можно заменить подстроку на другую подстроку в ячейке таблицы БД на MySQL или попросту посмотрим на альтернативу php функции STR_REPLACE в MySQL.
MySQL аналог STR_REPLACE MySQL
В MySQL есть прекрасный аналог, который работает прямо в запросах к БД.Выглядит он как:
REPLACE(haystack, needle, replace)Соответственно, здесь: haystack (стог сена) — графа/колонка/данные где нужно искать строку для замены, needle — строка, которую нужно заменить, replace — строка на которую нужно осуществить замену needle.
Эту MySQL функцию можно использовать непосредственно в запросах UPDATE. Представляете насколько упростит жизнь использование этой функции, если нужно где-нибудь что-то заменить, а записей 2000000, и на PHP писать str_replace не хочется, да и долго будет работать.
Рассмотрим на примере STR_REPLACE MySQL
Всё достаточно просто, предположим, у нас есть таблица, в которой в каждой ячейке графы «Name» нужно заменить «Иван» на «Ваня»:
UPDATE my_table SET name=REPLACE(name, 'Иван', 'Ваня')Или, например, усложним пример, и сделаем замены «Иван» на «Ваня», только для тех, у кого возраст (графа Age) меньше 18 лет (то есть не совершеннолетним):
UPDATE my_table SET name=REPLACE(name, 'Иван', 'Ваня') WHERE ageТеперь не нужно делать множество запросов на PHP, всё выполнится за считанные милисекунды (в зависимости от размера таблицы БД).
Полная документация по функции REPLACE (STR_REPLACE MySQL) доступна по адресу: REPLACE MySQL.
Надеюсь, эта статья поможет вам облегчить решение задачи по замене каких-либо данных в базах данных на MySQL.
53
Понравилась или помогла статья? Купите мне кофеhtmler.ru