我有一个小字符串:
JIW.sql;XXX.txt;Qwij.DLL;saasa.sql;ttt.txt;lok.SQL;ddd.jpg;aas.sql
我需要像这样选择
SELECT regexp_split_to_table('JIW.sql;XXX.txt;Qwij.DLL;saasa.sql;ttt.txt;lok.SQL;ddd.jpg;aas.sql', '[0-9A-z]*.sql');
我希望:
JIW.sql
saasa.sql
lok.SQL
aas.sql
但现在我有
---------------------------
;XXX.txt;Qwij.DLL;
;ttt.txt;lok.SQL;ddd.jpg;
(4 rows)
如何更改?
答案 0 :(得分:1)
您正在使用regexp_split_to_table
功能,当您的字符串与模式匹配时拆分。
您使用regex_matches
查找正则表达式模式的匹配项:
SELECT
regexp_matches(
'JIW.sql;XXX.txt;Qwij.DLL;saasa.sql;ttt.txt;lok.SQL;ddd.jpg;aas.sql',
E'([^;]+\.sql)',
'gi'
);
其中,gi
参数是全局和不区分大小写搜索的修饰符。结果将是like this。
您还可以使用unnest
功能获取result returned as rows instead。然后查询将是:
SELECT
unnest(
regexp_matches(
'JIW.sql;XXX.txt;Qwij.DLL;saasa.sql;ttt.txt;lok.SQL;ddd.jpg;aas.sql',
E'([^;]+\.sql)',
'gi'
)
);
答案 1 :(得分:1)
我认为你在寻找:
SELECT regexp_matches('JIW.sql;XXX.txt;Qwij.DLL;saasa.sql;ttt.txt;lok.SQL;ddd.jpg;aas.sql', '[0-9A-z]*.sql', 'g');
而不是ie。 regexp_matches 而不是 regexp_split_to_table
答案 2 :(得分:0)
我从未见过regexp_split_to_table
,但基于快速Google搜索(以及操作名称),我猜你给它的模式是分隔符模式。换句话说,返回的将是之间的值与模式匹配的字符串,以及将从结果中删除模式的匹配项。
如果你给了';"作为一种模式,它会产生
JIW.sql
XXX.txt
Qwij.DLL
saasa.sql
ttt.txt
lok.SQL
ddd.jpg
aas.sql
我不确定分裂是你正在尝试做的事情。
答案 3 :(得分:0)
如果您真的想使用regexp_split_to_table
,请尝试使用:
SELECT result.filename FROM
(SELECT regexp_split_to_table('JIW.sql;XXX.txt;Qwij.DLL;saasa.sql;ttt.txt;lok.SQL;ddd.jpg;aas.sql', ';') AS filename) result
WHERE result.filename ILIKE '%.sql'
输出:
"JIW.sql"
"saasa.sql"
"lok.SQL"
"aas.sql"