Comments 8
CREATE OR REPLACE FUNCTION replace_multiple(input_string TEXT, replacements TEXT[])
RETURNS TEXT AS
$$
DECLARE
i INT;
BEGIN
IF cardinality(replacements) % 2 <> 0 THEN
RAISE EXCEPTION 'Number of replacements must be even';
END IF;
FOR i IN 1..cardinality(replacements)/2 LOOP
input_string := replace(input_string, replacements[(i-1)*2+1], replacements[i*2]);
END LOOP;
RETURN input_string;
END;
$$
LANGUAGE plpgsql;
+1
Надо уточнять начальные условия.
- Строка
'ab'
, подстановки{'а' -> 'x', 'b' -> 'y', 'ab' -> 'z'}
. Какой результат ожидается? - Строка
'ab'
, подстановка{'' -> 'x'}
. Какой результат ожидается? - Какие символы допустимы в изначальной строке? Какие символы допустимы в подстановках?
0
Можно значительно проще и экономнее на regexp
Пример на MySQL (на PG думаю будет аналогично):
WITH d AS (
SELECT 'abcdaaabbbcccdcba' s
, 'a,x;bb,y;ccc,z;' repls
, 'xbcdxxxybzdcbx' test_res
)
, d2 AS (
SELECT *, CONCAT(s, '\n', repls) s_ex
FROM d
)
, d3 AS (
SELECT *
, SUBSTRING_INDEX(REGEXP_REPLACE(s_ex, '(?<search>[^\n]+)(?=.*?(\n|\n.*?;)\\\k<search>,(?<repl>[^;]+);)', '${repl}', 1, 0, 'm'), '\n', 1) res
FROM d2 d
)
SELECT s, res
, res = test_res is_correct
, VERSION() ver
FROM d3
+-----------------+--------------+----------+-----+
|s |res |is_correct|ver |
+-----------------+--------------+----------+-----+
|abcdaaabbbcccdcba|xbcdxxxybzdcbx|1 |8.3.0|
+-----------------+--------------+----------+-----+
+1
Нашёл подобное приемлемое решение на MySQL как закапиталайзить предложение
WITH d AS (
SELECT 'Lorem Ipsum is simply dummy text of the printing and typesetting industry.' s
)
, d2 AS (
SELECT *
, CONCAT(LOWER(s), UPPER(s)) s_l_u
, CONCAT('(?<=[[:space:]]|^)[a-z](?=.{', (CHAR_LENGTH(s) - 1), '}([A-Z]))') reg_exp
, CHAR_LENGTH(s) len
FROM d
)
SELECT version() ver, s, SUBSTR(REGEXP_REPLACE(s_l_u, reg_exp, '$1'), 1, len) cap
FROM d2
+------+--------------------------------------------------------------------------+--------------------------------------------------------------------------+
|ver |s |cap |
+------+--------------------------------------------------------------------------+--------------------------------------------------------------------------+
|8.0.35|Lorem Ipsum is simply dummy text of the printing and typesetting industry.|Lorem Ipsum Is Simply Dummy Text Of The Printing And Typesetting Industry.|
+------+--------------------------------------------------------------------------+--------------------------------------------------------------------------+
0
Sign up to leave a comment.
SQL HowTo: замена в строке по набору