powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Заменить XXXX => Xxxxx в строках
4 сообщений из 4, страница 1 из 1
Заменить XXXX => Xxxxx в строках
    #38767968
Andrew_Lvov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Допустим, есть строки вида: 'John bought MACBOOK AIR'. Как заменить во всех строках на 'John bought Macbook Air" ?
Задев слова только от 4х символов и больше, только из букв.
...
Рейтинг: 0 / 0
Заменить XXXX => Xxxxx в строках
    #38768185
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrew_LvovДопустим, есть строки вида: 'John bought MACBOOK AIR'. Как заменить во всех строках на 'John bought Macbook Air" ?
Задев слова только от 4х символов и больше, только из букв.

-- неувязочка.

PS на слова разбить скорее всего удобнее Regexp-matches-ом regexp-spit-ом
Код: sql
1.
2.
3.
SELECT regexp_split_to_array('John bought MACBOOK AIR'
,E'\\s'
)


потом над элементами массива слов, в зависимости от условия вида "от 4х символов и больше, только из букв"
поиздеваться самопальной функцией, lower-ящей всё, кроме первого символа. (напишете, надеюсь ?)

PPS
если опустить условие -- то можно было так (не быстрое, но ленивое в написании) :
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT string_agg(res,'')  FROM
(
	SELECT
		CASE WHEN  lag(u) over()<>' ' THEN
			lower(u)
		ELSE
			u
		END AS res
		FROM  unnest(string_to_array('John bought MACBOOK AIR',null)) u
)   pars


+ склеить массив слов взад (потеряв различие меж пробелами для regexp_split_to_array)

PPPS ленивое разбиение на слова с разделительными постфиксами:
Код: sql
1.
2.
3.
4.
SELECT r[1]||r[2] FROM  (SELECT regexp_matches('    John 			bought 		MACBOOK AIR            '
,E'([^\\s]*)([\\s]*)'
,'ig'
)) AS r(r) WHERE r[1]||r[2] <>''



ну и т.п.
http://www.postgresql.org/docs/current/static/functions.html
...
Рейтинг: 0 / 0
Заменить XXXX => Xxxxx в строках
    #38768566
Andrew_Lvov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

спасибо!

Пришлось чуть-чуть адаптировать, реализовал так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE OR REPLACE FUNCTION normalize(inp_str VARCHAR)
RETURNS VARCHAR as $$
DECLARE
t_str VARCHAR;
t_str_copy VARCHAR;
BEGIN
t_str = (regexp_matches(inp_str, '[A-Z]{4,}'))[1];
if t_str IS NOT NULL THEN
t_str_copy = upper(substring(t_str from 1 FOR 1)) ||
lower(substring(t_str FROM 2 FOR length(t_str)-1 ));
inp_str := replace(inp_str, t_str, t_str_copy);
END IF;
RETURN inp_str;
END;
$$ LANGUAGE plpgsql;

UPDATE catalogue_product
SET title = normalize(title);



Правда, я не нашёлся, как с пробелами (типа "MACBOOK AIR"), решил пока не попавшие под фильтр исправить вручную.
...
Рейтинг: 0 / 0
Заменить XXXX => Xxxxx в строках
    #38768576
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrew_Lvov,

А функцию initcap() никак нельзя исопльзовать?
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Заменить XXXX => Xxxxx в строках
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]