powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как заменить цепочки символов в строке?
17 сообщений из 17, страница 1 из 1
Как заменить цепочки символов в строке?
    #39635439
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
N пробелов на 1 пробел.

Сам запрос работает

Код: sql
1.
2.
3.
    ;WITH A AS (SELECT n FROM (VALUES (32),(16),(8),(4),(2),(1)) A(n))
    SELECT REPLACE('1 1 1 2  2  2  3   3   3', repeat(' ', n + 1), repeat(' ', 1))
    FROM A	ORDER BY n DESC




В блоке пишет неизмененную строку, как в ту же строку выбрать?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DO
$do$
DECLARE
   ins text :='1 1 1 2  2  2  3   3   3';
BEGIN
    RAISE NOTICE 's1: %',ins;
    
    WITH A AS (SELECT n FROM (VALUES (32),(16),(8),(4),(2),(1)) A(n))
    SELECT REPLACE(ins, repeat(' ', n + 1), repeat(' ', 1)) into ins
    FROM A
	ORDER BY n DESC;
    
    RAISE NOTICE 's2: %',ins;
END
$do$



---
NOTICE: s1: 1 1 1 2 2 2 3 3 3
NOTICE: s2: 1 1 1 2 2 2 3 3 3
...
Рейтинг: 0 / 0
Как заменить цепочки символов в строке?
    #39635449
grgdvo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ролг Хупин,

А почему не взяли регулярные выражения??

Код: sql
1.
select regexp_replace('1 1 1 2  2  2  3   3   3', '\s\s+', ' ', 'g');
...
Рейтинг: 0 / 0
Как заменить цепочки символов в строке?
    #39635456
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grgdvoРолг Хупин,

А почему не взяли регулярные выражения??

Код: sql
1.
select regexp_replace('1 1 1 2  2  2  3   3   3', '\s\s+', ' ', 'g');



я мыслю категориями SQL Server.

красиво, спасибо!
...
Рейтинг: 0 / 0
Как заменить цепочки символов в строке?
    #39635479
grgdvo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ролг Хупин,

да, и насчет второго вопроса... выбрать в ту же строку.
у вас запрос, судя по структуре, должен возвращать набор записей.
по умолчанию для into, когда запросом возвращается несколько записей, то будет возвращена первая запись.
в вашем запросе первая запись должна быть такой же, потому что нет 32 пробелов между символами.
поэтому, скорее всего, и получаете как бы тоже самое значение.
...
Рейтинг: 0 / 0
Как заменить цепочки символов в строке?
    #39635511
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grgdvoРолг Хупин,

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

Ясно, в данном случае я это делаю в функции:

Код: sql
1.
    stxt :=RTRIM(LTRIM(regexp_replace(stxt, '\s\s+', ' ', 'g')));
...
Рейтинг: 0 / 0
Как заменить цепочки символов в строке?
    #39635542
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
функциями быстрее должно быть
Код: sql
1.
2.
3.
4.
select array_remove(string_to_array('1 2     3       4     5', ' '),'');
 array_remove
--------------
 {1,2,3,4,5}
...
Рейтинг: 0 / 0
Как заменить цепочки символов в строке?
    #39635546
Ы2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинЯсно, в данном случае я это делаю в функции:
Код: sql
1.
    stxt :=RTRIM(LTRIM(regexp_replace(stxt, '\s\s+', ' ', 'g')));


Есть же btrim :)
...
Рейтинг: 0 / 0
Как заменить цепочки символов в строке?
    #39635565
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78функциями быстрее должно быть
Код: sql
1.
2.
3.
4.
select array_remove(string_to_array('1 2     3       4     5', ' '),'');
 array_remove
--------------
 {1,2,3,4,5}



не в этом разе.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with a(s) AS (
SELECT s FROM generate_series(1,50000) g
,lateral (SELECT string_agg( concat(i ,repeat(text' ', (random()*(2+i))::int)) ,' ') s from generate_series(1,5) i) l

)


select TRIM(regexp_replace(s, '  +', ' ', 'g')) from a
 


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
'CTE Scan on a  (cost=50.03..75.03 rows=1000 width=32) (actual time=3.175..209.625 rows=50000 loops=1)'
'  Output: btrim(regexp_replace(a.s, '  +'::text, ' '::text, 'g'::text))'
'  Buffers: temp written=225'
'  CTE a'
'    ->  Nested Loop  (cost=30.01..50.03 rows=1000 width=32) (actual time=3.157..9.425 rows=50000 loops=1)'
'          Output: (string_agg(concat(i.i, repeat(' '::text, ((random() * ((2 + i.i))::double precision))::integer)), ' '::text))'
'          ->  Aggregate  (cost=30.00..30.02 rows=1 width=32) (actual time=0.056..0.057 rows=1 loops=1)'
'                Output: string_agg(concat(i.i, repeat(' '::text, ((random() * ((2 + i.i))::double precision))::integer)), ' '::text)'
'                ->  Function Scan on pg_catalog.generate_series i  (cost=0.00..10.00 rows=1000 width=4) (actual time=0.013..0.015 rows=5 loops=1)'
'                      Output: i.i'
'                      Function Call: generate_series(1, 5)'
'          ->  Function Scan on pg_catalog.generate_series g  (cost=0.00..10.00 rows=1000 width=0) (actual time=3.098..5.834 rows=50000 loops=1)'
'                Output: g.g'
'                Function Call: generate_series(1, 50000)'
'Planning time: 0.198 ms'
'Execution time: 212.147 ms'



против:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with a(s) AS (
SELECT s FROM generate_series(1,50000) g
,lateral (SELECT string_agg( concat(i ,repeat(text' ', (random()*(2+i +g%5))::int)) ,' ') s from generate_series(1,5) i) l

)


select array_remove(string_to_array(s,' '),'' ) from a;
 



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
'CTE Scan on a  (cost=35045.00..35070.00 rows=1000 width=32) (actual time=4.658..319.131 rows=50000 loops=1)'
'  Buffers: temp written=229'
'  CTE a'
'    ->  Nested Loop  (cost=35.01..35045.00 rows=1000 width=32) (actual time=4.644..199.015 rows=50000 loops=1)'
'          ->  Function Scan on generate_series g  (cost=0.00..10.00 rows=1000 width=4) (actual time=4.609..7.215 rows=50000 loops=1)'
'          ->  Aggregate  (cost=35.00..35.01 rows=1 width=32) (actual time=0.004..0.004 rows=1 loops=50000)'
'                ->  Function Scan on generate_series i  (cost=0.00..10.00 rows=1000 width=4) (actual time=0.000..0.000 rows=5 loops=50000)'
'Planning time: 0.095 ms'
'Execution time: 322.256 ms'

...
Рейтинг: 0 / 0
Как заменить цепочки символов в строке?
    #39635570
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пысы: регексп-сплита бойтесь. как правило каскад из рег-реплейса и обычного сплита бьёт регесп_сплита в разы.
...
Рейтинг: 0 / 0
Как заменить цепочки символов в строке?
    #39635581
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

наврал . генераторы данных несимметрично изменил. ф--ии немногим быстрее.
...
Рейтинг: 0 / 0
Как заменить цепочки символов в строке?
    #39635641
Фотография Takurava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как заменить цепочки символов в строке?
    #39635725
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqqwwq,

наврал . генераторы данных несимметрично изменил. ф--ии немногим быстрее.
ещё и генератор внутри explain зачем-то оставили )))
...
Рейтинг: 0 / 0
Как заменить цепочки символов в строке?
    #39635911
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как заменить цепочки символов в строке?
    #39635927
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинTakurava Как оставить только один пробел между словами

красивое давнее решение!

Хмм... красивое-то оно красивое, но:

1. работает:
select regexp_replace('



Это мой отчёт блин ''Щ''. ', '\s\s+', ' ', 'g');


2. не работает
select
replace(
replace (
replace('



Это мой отчёт блин ''Щ''. ',' ',' '||chr(9)),chr(9)||' ',''),' '||chr(9),' ');
...
Рейтинг: 0 / 0
Как заменить цепочки символов в строке?
    #39635929
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинTakurava Как оставить только один пробел между словами

красивое давнее решение!
ещё и быстрое.
///если забить на выяснение невстречаемого. chr(0) в пж нельзя.
бьёт даже регулярку. немного.
хотя регулярка унутре д.б. изящнее устроена. (фифо/лифо (от жадности) на одном проходе). видимо универсальность подвела.
...
Рейтинг: 0 / 0
Как заменить цепочки символов в строке?
    #39635941
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинРолг Хупинпропущено...


красивое давнее решение!

Хмм... красивое-то оно красивое, но:

1. работает:
select regexp_replace('



Это мой отчёт блин ''Щ''. ', '\s\s+', ' ', 'g');


2. не работает
select
replace(
replace (
replace('



Это мой отчёт блин ''Щ''. ',' ',' '||chr(9)),chr(9)||' ',''),' '||chr(9),' ');

дядинька, ты с дуба слез?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select 
replace(
replace (
replace(translate('



Это мой отчёт блин ''Щ''. '
,E'\n\r\t'
,'   ')
,' ',' '||chr(9)),chr(9)||' ',''),' '||chr(9),' '); 



полный перечень символов, замещаемых \s см в букваре.
...
Рейтинг: 0 / 0
Как заменить цепочки символов в строке?
    #39635979
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqРолг Хупинпропущено...


Хмм... красивое-то оно красивое, но:

1. работает:
select regexp_replace('



Это мой отчёт блин ''Щ''. ', '\s\s+', ' ', 'g');


2. не работает
select
replace(
replace (
replace('



Это мой отчёт блин ''Щ''. ',' ',' '||chr(9)),chr(9)||' ',''),' '||chr(9),' ');

дядинька, ты с дуба слез?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select 
replace(
replace (
replace(translate('



Это мой отчёт блин ''Щ''. '
,E'\n\r\t'
,'   ')
,' ',' '||chr(9)),chr(9)||' ',''),' '||chr(9),' '); 



полный перечень символов, замещаемых \s см в букваре.

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


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