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;