Спецы в базах данных, отзовитесь.
функция которая добавляет недостаущие в октете нули в представлении ip адреса
например если в таблице значение 10.1.2.3
то select вернет 010.001.002.003
еще пример: 172.25.36.5 -> 172.025.036.005
Написал для mySQL и MSSQL, а для ORACLE не получается.
Приложены внизу работающие примеры для mySQL и MSSQL.
Спасибо за помощь
-----
MySQL
select
CONCAT(
LPAD( SUBSTRING_INDEX( IpValue, '.', 1 ),
3, '0' ),
'.',
LPAD( SUBSTRING_INDEX( SUBSTRING_INDEX( IpValue, '.', -3 ), '.', 1 ),
3, '0' ),
'.',
LPAD( SUBSTRING_INDEX( SUBSTRING_INDEX( IpValue, '.', -2 ), '.', 1 ),
3, '0' ),
'.',
LPAD( SUBSTRING_INDEX( SUBSTRING_INDEX( IpValue, '.', -1 ), '.', 1 ),
3, '0' )
)
from T_IP;
-------------------------
MSSQL
select
REPLICATE( '0',
3 - LEN(CONVERT( int, CONVERT( float, SUBSTRING( IpValue, 1, 3 ) ) ) ) )
+CONVERT( VARCHAR(3), CONVERT( int, CONVERT( float, SUBSTRING( IpValue, 1, 3 ) ) ) )
+ '.'
+ REPLICATE( '0',
3 - LEN( CONVERT( int, CONVERT( float, SUBSTRING( IpValue,
PATINDEX('%.%.%', IpValue) + 1, 3 ) ) ) ) )
+ CONVERT( VARCHAR(3), CONVERT( int, CONVERT( float, SUBSTRING( IpValue,
PATINDEX('%.%.%', IpValue) + 1, 3 ) ) ) )
+ '.'
+ REPLICATE( '0',
3 - LEN( CONVERT( int, CONVERT( float, SUBSTRING( SUBSTRING( IpValue, 5, 11 ),
PATINDEX('%.%.%', SUBSTRING( IpValue, 5, 11 ) ) + 1, 3 ) ) ) ) )
+ CONVERT( VARCHAR(3), CONVERT( int, CONVERT( float, SUBSTRING( SUBSTRING( IpValue, 5, 11 ),
PATINDEX('%.%.%', SUBSTRING( IpValue, 5, 11 ) ) + 1, 3 ) ) ) )
+ '.'
+ REPLICATE( '0',
3 - LEN(CONVERT( int, SUBSTRING( RIGHT( RTRIM(IpValue), 3 ), CHARINDEX( '.',
RIGHT( RTRIM(IpValue), 3 ) ) + 1, 3 ) ) ) )
+ CONVERT( VARCHAR(3), CONVERT( int, SUBSTRING( RIGHT( RTRIM(IpValue), 3 ), CHARINDEX( '.',
RIGHT( RTRIM(IpValue), 3 ) ) + 1, 3 ) ) )
from T_IP;
Как это в Oracle сделать
-
- Уже с Приветом
- Posts: 176
- Joined: 05 Sep 2000 09:01
- Location: Seattle,WA,USA
-
- Уже с Приветом
- Posts: 1962
- Joined: 24 Feb 2001 10:01
- Location: Челябинск -> Everett, WA
Code: Select all
CREATE OR REPLACE FUNCTION transform_ip
(ip_addr_in VARCHAR2) RETURN VARCHAR2 IS
buf VARCHAR2(100);
ip_addr_out VARCHAR2(100);
dot_loc INTEGER;
BEGIN
buf := ip_addr_in;
dot_loc := instr(buf, '.');
WHILE (dot_loc > 0)
LOOP
ip_addr_out := ip_addr_out||lpad(substr(buf, 1, dot_loc-1),3,'0')||'.';
buf := substr(buf, dot_loc+1);
dot_loc := instr(buf, '.');
END LOOP;
RETURN rtrim(ip_addr_out,'.');
END transform_ip;
-
- Уже с Приветом
- Posts: 664
- Joined: 05 Jun 2002 01:11
Re: Как это в Oracle сделать
BoTa wrote:Спецы в базах данных, отзовитесь.
функция которая добавляет недостаущие в октете нули в представлении ip адреса
например если в таблице значение 10.1.2.3
то select вернет 010.001.002.003
еще пример: 172.25.36.5 -> 172.025.036.005
Написал для mySQL и MSSQL, а для ORACLE не получается.
Приложены внизу работающие примеры для mySQL и MSSQL.
Спасибо за помощь
-----
MySQL
select
CONCAT(
LPAD( SUBSTRING_INDEX( IpValue, '.', 1 ),
3, '0' ),
'.',
LPAD( SUBSTRING_INDEX( SUBSTRING_INDEX( IpValue, '.', -3 ), '.', 1 ),
3, '0' ),
'.',
LPAD( SUBSTRING_INDEX( SUBSTRING_INDEX( IpValue, '.', -2 ), '.', 1 ),
3, '0' ),
'.',
LPAD( SUBSTRING_INDEX( SUBSTRING_INDEX( IpValue, '.', -1 ), '.', 1 ),
3, '0' )
)
from T_IP;
-------------------------
MSSQL
select
REPLICATE( '0',
3 - LEN(CONVERT( int, CONVERT( float, SUBSTRING( IpValue, 1, 3 ) ) ) ) )
+CONVERT( VARCHAR(3), CONVERT( int, CONVERT( float, SUBSTRING( IpValue, 1, 3 ) ) ) )
+ '.'
+ REPLICATE( '0',
3 - LEN( CONVERT( int, CONVERT( float, SUBSTRING( IpValue,
PATINDEX('%.%.%', IpValue) + 1, 3 ) ) ) ) )
+ CONVERT( VARCHAR(3), CONVERT( int, CONVERT( float, SUBSTRING( IpValue,
PATINDEX('%.%.%', IpValue) + 1, 3 ) ) ) )
+ '.'
+ REPLICATE( '0',
3 - LEN( CONVERT( int, CONVERT( float, SUBSTRING( SUBSTRING( IpValue, 5, 11 ),
PATINDEX('%.%.%', SUBSTRING( IpValue, 5, 11 ) ) + 1, 3 ) ) ) ) )
+ CONVERT( VARCHAR(3), CONVERT( int, CONVERT( float, SUBSTRING( SUBSTRING( IpValue, 5, 11 ),
PATINDEX('%.%.%', SUBSTRING( IpValue, 5, 11 ) ) + 1, 3 ) ) ) )
+ '.'
+ REPLICATE( '0',
3 - LEN(CONVERT( int, SUBSTRING( RIGHT( RTRIM(IpValue), 3 ), CHARINDEX( '.',
RIGHT( RTRIM(IpValue), 3 ) ) + 1, 3 ) ) ) )
+ CONVERT( VARCHAR(3), CONVERT( int, SUBSTRING( RIGHT( RTRIM(IpValue), 3 ), CHARINDEX( '.',
RIGHT( RTRIM(IpValue), 3 ) ) + 1, 3 ) ) )
from T_IP;
Code: Select all
select
lpad(substr(x, 1, instr(x, '.',1,1)), 4,0)||
lpad(substr(x, instr(x, '.',1,1)+1, instr(x, '.', 1, 2)-instr(x, '.', 1, 1)), 4,0)||
lpad(substr(x, instr(x, '.',1,2)+1, instr(x, '.', 1, 3)-instr(x, '.', 1, 2)), 4,0)||
lpad(substr(x, instr(x, '.',1,3)+1, length(x)), 3, 0)
from t1
Rgds.
-
- Уже с Приветом
- Posts: 176
- Joined: 05 Sep 2000 09:01
- Location: Seattle,WA,USA