如何从sql表中获取子串?

时间:2014-08-12 19:09:34

标签: sql database postgresql pattern-matching

所以我在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)))))))

但这只会返回一堆/个符号而根本没有数字。

如果有人可以帮我查询这个子字符串,我会非常感激

2 个答案:

答案 0 :(得分:3)

select
  split_part(account_url, '/', 3)
from exp_logs;

的工作原理。

http://www.postgresql.org/docs/9.3/static/functions-string.html

兼容性:8.3 +

小提琴:http://sqlfiddle.com/#!15/5e931/1

答案 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行的桌子上进行快速测试时证明是最快的。