包含默认空数组的正则表达式替换

时间:2020-04-15 10:11:04

标签: sql arrays regex postgresql sql-function

我正在尝试创建一个函数,该函数带有一个文本参数和一个文本参数数组,当不传递第二个参数时,该数组默认为空数组。

然后,我想替换text参数中也出现在要删除的文本数组中的所有单词。如果此数组为空,则我不想删除任何内容。

到目前为止,我有这个:

create or replace function remove_words(name text, words_to_remove text[] default '{}'::text[]) returns text as
$$
    select regexp_replace(name,(select '(' || string_agg(r,'|') || ')' from unnest(words_to_remove) r),'','gi');
$$ language sql immutable parallel safe;

此刻,如果我同时调用两个参数的函数,它似乎可以按预期运行:

select remove_words('red orange blue green', '{black, brown, green, orange}');

 remove_words 
---------------
 red blue 

但是,如果我不使用第二个参数,则返回的文本将为空白,而不是原始值:

select remove_words('red orange blue green');
 remove_words 
---------------

有人可以建议我如何进行这项工作吗?

1 个答案:

答案 0 :(得分:1)

我会采取相反的方法,即:将字符串变成单词表,然后消除属于数组的单词。

create or replace function remove_words(
    name text, 
    words_to_remove text[] default '{}'::text[]
) returns text as
$$
    select string_agg(word, ' ')
    from unnest(string_to_array(name, ' ')) n(word)
    where not n.word = any (words_to_remove)
$$ language sql immutable parallel safe;

您还可以使用regexp_split_to_table()分割字符串:

create or replace function remove_words2(
    name text, 
    words_to_remove text[] default '{}'::text[]
) returns text as
$$
    select string_agg(word, ' ')
    from regexp_split_to_table(name, ' ') n(word)
    where not n.word = any (words_to_remove)
$$ language sql immutable parallel safe;

这可以正确处理输入数组为空的情况。

Demo on DB Fiddle

select remove_words('red orange blue green', '{black, brown, green, orange}');

| remove_words |
| ------------ |
| red blue     |


select remove_words('red orange blue green');

| remove_words          |
| --------------------- |
| red orange blue green |


select remove_words2('red orange blue green', '{black, brown, green, orange}');

| remove_words2 |
| ------------- |
| red blue      |


select remove_words2('red orange blue green');

| remove_words2         |
| --------------------- |
| red orange blue green |