Oracle - Group By和split

时间:2011-05-13 12:55:21

标签: database oracle

我喜欢通过所有IP地址和端口获得一个组。

这是我的选择脚本:

SELECT Count(p.url) nr, SUBSTR(p.url, 8, 19) as IpPort
FROM pages p
GROUP BY SUBSTR(p.url, 8, 19)
Order By nr DESC 


Table data:
url
http://10.0.0.10:123/test/foo/bar
http://10.0.0.10:456/tasdfest/foasdfo/baasdfr
http://localhost:125/asdf/
etc.

此脚本适用于ip addresse,但不适用于字符串“localhost”。

如何获取所有IP地址和端口。 localhost(没有http://和/)?

任何帮助都将不胜感激。

谢谢!

3 个答案:

答案 0 :(得分:1)

至少有三种方法可以解决这个问题。

首先,有一种使用instr和substr

组合的传统方法

substr(url, 8, instr(url, '/',1,3)-8) as ipport

然后使用正则表达式函数有几种不同的方法。这些示例匹配不是斜杠字符/的所有内容,因此如果端口号后面没有斜杠,则可能存在问题。

regexp_substr(url, '([^/]+)',8)

regexp_replace(url, 'http://([^/]+)/.*', '\1')

我想我可能更喜欢regexp_substr版本,但是如果您的数据量很高,那么坚持使用substr / instr选项可能需要付费,因为根据我在Oracle 10g下的经验,正则表达式函数并不是那么快。

与任何文本匹配操作一样,请确保您的代码与所有可能的数据匹配。

答案 1 :(得分:0)

您可以使用REGEXP_SUBSTR()查找不同的部分,然后按此

进行分组

请参阅:http://download.oracle.com/docs/cd/B13789_01/server.101/b10759/functions116.htm

使用

的帮助构建您的REGEX

http://regexpal.com/

答案 2 :(得分:0)

使用INSTR()查找第三个斜杠的索引:

SELECT Count(p.url) nr, SUBSTR(p.url, 8, instr(p.url, '/', 8)) as IpPort
FROM pages p
GROUP BY SUBSTR(p.url, 8, 19)
Order By nr DES

仅在所有内容均以http://

开头时才有效
相关问题