我已经'THOMAS,RANJAN,JDJDJDJ,OOOO'
我想用Postgres中的x掩饰第1个第3个第4个字符
答案 0 :(得分:1)
如果要对所有四个逗号分隔部分进行替换,可以使用以下内容:
WITH mytable(mystring) AS (SELECT 'THOMAS,RANJAN,JDJDJDJ,OOOO'::text)
SELECT string_agg(
overlay(
overlay(
a.p
placing 'x' from 1 for 1
)
placing 'xx' from 3 for 2
),
','
)
FROM mytable
CROSS JOIN LATERAL
unnest(string_to_array(mystring, ',')) a(p);
导致
┌────────────────────────────┐
│ string_agg │
├────────────────────────────┤
│ xHxxAS,xAxxAN,xDxxJDJ,xOxx │
└────────────────────────────┘
(1 row)
如果您不需要为所有部分进行替换,但对于整个字符串,只需使用两个overlay
并忘记其余部分。
答案 1 :(得分:0)
您也可以使用正则表达式。一个正则表达式用于获取插入位置(其中x应该是),另一个用于获取其余的子串(文本应保持原样)。
以下内容也适用于较短的字符串。
SELECT test.replace_string_134('THOMAS,RANJAN,JDJDJDJ,OOOO,b,bl,bla');
产量:xHxxAS,xAxxAN,xDxxJDJ,xOxx,x,xl,xlx
我将此作为替代样本发布,但为了表现明智,您可以关注@LaurenzAlbe回答。
CREATE SCHEMA test;
CREATE OR REPLACE FUNCTION test.replace_string_134 (TEXT)
RETURNS TEXT
AS
$$
DECLARE
input_text ALIAS FOR $1;
BEGIN
RETURN (
SELECT STRING_AGG(
CASE WHEN tgroup.txt_group[1] <> '' THEN 'x' ELSE '' END
|| trest.txt_rest[1]
|| CASE WHEN tgroup.txt_group[2] <> '' THEN 'x' ELSE '' END
|| CASE WHEN tgroup.txt_group[3] <> '' THEN 'x' ELSE '' END
|| trest.txt_rest[2],
',')
FROM
(
SELECT txt_group, ROW_NUMBER() OVER () AS txt_index
FROM regexp_matches(input_text, '[,]?([^,])[^,]?([^,]?)([^,]?)[^,]*[,]?', 'g') AS txt_group
) AS tgroup
INNER JOIN
(
SELECT txt_rest, ROW_NUMBER() OVER () AS txt_index
FROM regexp_matches(input_text, '[,]?[^,]([^,]?)[^,]?[^,]?([^,]*)[,]?', 'g') AS txt_rest
) AS trest
ON trest.txt_index = tgroup.txt_index
);
END
$$
LANGUAGE plpgsql;
SELECT test.replace_string_134('THOMAS,RANJAN,JDJDJDJ,OOOO,b,bl,bla');
DROP SCHEMA test CASCADE;