|
我有一张表记录了我们系统的登录记录:谁在什么时间从哪个主机登录
create table plch_logins (
when timestamp(0) not null
, who varchar2(10) not null
, host varchar2(30) not null
)
/
insert into plch_logins values (
timestamp '2016-02-01 10:00:10', 'John', '192.168.200.155'
)
/
insert into plch_logins values (
timestamp '2016-02-01 10:01:20', 'Jill', '10.0.0.42'
)
/
insert into plch_logins values (
timestamp '2016-02-01 10:02:30', 'Jack', 'pc42.plchhost.org'
)
/
insert into plch_logins values (
timestamp '2016-02-01 10:03:40', 'Jeff', 'cubic.com10.net'
)
/
insert into plch_logins values (
timestamp '2016-02-01 10:04:50', 'John', '192.168.200.155'
)
/
commit
/
有时候host是主机名字,有时候是IP地址。
我想知道每个主机的登录次数,但仅仅是对使用了IP地址的记录(而不是主机名字)。为此我有这个未完成的查询:
select host
, count(*) logins
from plch_logins
##REPLACE##
group by host
order by logins desc, host
/
哪些选项可用来取代##REPLACE##使得查询返回如下输出:
HOST LOGINS
------------------------------ ----------
192.168.200.155 2
10.0.0.42 1
(A)
where regexp_like(host, '^\d{1,3}(\.\d{1,3}){3}$')
(B)
where regexp_like(host, '^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$')
(C)
where regexp_like(host, '^\d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d?$')
(D)
where regexp_like(
host
, '^[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.' ||
'[[:digit:]]{1,3}\.[[:digit:]]{1,3}$'
)
(E)
where regexp_substr(host, '^\d{1,3}(\.\d{1,3}){3}$') = host
(F)
where regexp_substr(host, '^\d{1,3}(\.\d{1,3}){3}$') is not null
(G)
where regexp_replace(host, '^\d{1,3}(\.\d{1,3}){3}$') is null
(H)
where instr(host, '.', 1, 1) between 2 and 4
and instr(host, '.', 1, 2) between instr(host, '.', 1, 1) + 2
and instr(host, '.', 1, 1) + 4
and instr(host, '.', 1, 3) between instr(host, '.', 1, 2) + 2
and instr(host, '.', 1, 2) + 4
and instr(host, '.', 1, 3) >= length(host) - 3
and instr(host, '.', 1, 4) = 0
and regexp_replace(host, '[^0123456789.]') = host
(I)
where instr(host, '.', 1, 1) between 2 and 4
and instr(host, '.', 1, 2) between instr(host, '.', 1, 1) + 2
and instr(host, '.', 1, 1) + 4
and instr(host, '.', 1, 3) between instr(host, '.', 1, 2) + 2
and instr(host, '.', 1, 2) + 4
and instr(host, '.', 1, 3) >= length(host) - 3
and instr(host, '.', 1, 4) = 0
and translate(
host
, '#' || translate(host, '#0123456789.', '#')
, '#'
) = host
|
|