所以我在postgres表中有一个列(称为account_uri),如下所示:
/randomCharacters/123456/randomNumbers
我需要查询中间的子字符串,这是两个/
符号之间的字符串。
我目前的尝试看起来像这样:
SELECT
REVERSE(SUBSTRING(REVERSE([account_uri]),0,CHARINDEX('/',REVERSE(account_uri))))
FROM exp_logs
LIMIT 15
仅选择randomNumbers而不选择所需的数字。
我试图在此基础上继续使用
(SUBSTRING(REVERSE(SUBSTRING(REVERSE([account_uri]),CHARINDEX('/',REVERSE(account_uri)))),1,CHARINDEX('/',REVERSE(SUBSTRING(REVERSE([account_uri]),CHARINDEX('/',REVERSE(account_uri)))))))
但这只会返回一堆/
个符号而根本没有数字。
如果有人可以帮我查询这个子字符串,我会非常感激
答案 0 :(得分:3)
select
split_part(account_url, '/', 3)
from exp_logs;
的工作原理。
http://www.postgresql.org/docs/9.3/static/functions-string.html
兼容性:8.3 +
答案 1 :(得分:3)
一些解决方案,按最快的排序:
SELECT split_part(account_uri, '/', 3) AS solution_1 -- Neil's solution
,substring(account_uri,'^/.*?/(.*?)/') AS solution_2
,substring(account_uri,'^/[^/]*/(\d*)') AS solution_3
,(string_to_array(account_uri,'/'))[3] AS solution_4
FROM (
VALUES
('/randomCharacters/123456/randomNumbers')
,('/v o,q9063´6qu/24734782/2369872986')
,('/DFJTDZTJ/1/234567')
,('/ ijgtoqu29836UGB /999/29672')
) exp_logs(account_uri);
@Neil's solution在一个有30k行的桌子上进行快速测试时证明是最快的。