PostgreSQL,结果到数组

PostgreSQL,结果到数组,postgresql,Postgresql,在我的程序中,我(几乎)有这样一个表: CREATE TEMP TABLE temp_list (profilenum integer, profilename text, compid text) ON COMMIT DROP; INSERT INTO temp_list VALUES (1, 'bynamePROFILE_border_Minimal', '03'), (2, 'bynamePROFILE_backoffice_Universal'

在我的程序中,我(几乎)有这样一个表:

CREATE TEMP TABLE temp_list 
   (profilenum integer, profilename text, compid text) 
   ON COMMIT DROP;
INSERT INTO temp_list 
VALUES (1, 'bynamePROFILE_border_Minimal',       '03'),
       (2, 'bynamePROFILE_backoffice_Universal', '03'),
       (3, 'bynamePROFILE_calc_Universal',       '03'),
       (4, 'bynamePROFILE_calc_Universal',       '02'),
       (5, 'bynamePROFILE_backoffice_Minimal',   '01'),
       (6, 'bynamePROFILE_ilup_Universal',       '03');   
我可以这样查询:

SELECT profilename  
  FROM temp_list WHERE compid='03' AND profilename LIKE 'bynamePROFILE_%';
。。。什么会产生预期的结果。
但是我需要一些字符串操作来获得想要的字符串,这些字符串适合最近在我的程序中转换为数组形式:

SELECT array_agg(btrim(profilename, 'bynamePROFILE_')) 
  FROM temp_list WHERE compid='03' AND profilename LIKE 'bynamePROFILE_%';  
这给了我不正确的结果:

"{order_Minimal,ckoffice_Universal,calc_Universal,ilup_Universal}"  
 (note missing first letter(s) in words beginning with 'b')
而不是:

"{border_Minimal,backoffice_Universal,calc_Universal,ilup_Universal}"
这是因为我(像往常一样)还是因为PostgreSQL,我的查询是否可以改进以获得想要的结果

Windows 10/64,PostgreSQL 9.6

btrim(字符串文本[,字符文本])

从字符串的开头和结尾删除仅由字符(默认为空格)中的字符组成的最长字符串

如果要删除前缀
abba
,则函数
btrim()
不是正确的选择:

with my_table (str) as (
values
    ('abbababax')
)

select btrim(str, 'abba')
from my_table;

 btrim 
-------
 x
(1 row)
使用其他字符串操作函数之一,例如
right()

使用regexp的示例。使用
^
字符确保从字符串开头删除子字符串:

select regexp_replace(str, '^abba', '')
from my_table;

最好的选择可能是
regexp\u replace
@jcaron-可能不是,因为regexp函数更昂贵。我的意思是在抵抗各种输入和以后的代码更改方面。当然,这取决于要处理的行数。关于对各种输入的阻力这一点很好,尽管它可以很容易地解决,请参阅更新的答案。我明白了,谢谢“klin”。你们信不信由你们,这段btrim代码在我的程序中已经运行了几年:)右字符串运行正常。如果可能的话,我希望看到用regex替换的例子。
select regexp_replace(str, '^abba', '')
from my_table;