Как это в Oracle сделать

BoTa
Уже с Приветом
Posts: 176
Joined: 05 Sep 2000 09:01
Location: Seattle,WA,USA

Как это в Oracle сделать

Post by BoTa »

Спецы в базах данных, отзовитесь.
функция которая добавляет недостаущие в октете нули в представлении 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;
sp123
Уже с Приветом
Posts: 1963
Joined: 24 Feb 2001 10:01
Location: Челябинск -> Everett, WA

Post by sp123 »

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;
vc
Уже с Приветом
Posts: 664
Joined: 05 Jun 2002 01:11

Re: Как это в Oracle сделать

Post by vc »

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.
BoTa
Уже с Приветом
Posts: 176
Joined: 05 Sep 2000 09:01
Location: Seattle,WA,USA

Post by BoTa »

vc и sp123
Больше вам спасибо!!!
Очень помогли

Return to “Вопросы и новости IT”