Advertisement
Guest User

Untitled

a guest
Dec 2nd, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE TABLE ipv6 (
  2. address VARCHAR2(40)
  3. );
  4.  
  5. INSERT INTO ipv6 VALUES('0:0:0:0:0:0:0:0');
  6. INSERT INTO ipv6 VALUES('0:10:0:10:0:0:0:0');
  7. INSERT INTO ipv6 VALUES('0:0:10:0:10:0:10:0');
  8. INSERT INTO ipv6 VALUES('0:10:0:0:10:0:0:10');
  9. INSERT INTO ipv6 VALUES('0:0:10:0:0:1011:101:1011');
  10. INSERT INTO ipv6 VALUES('10:20:30:40:50:60:70:8');
  11.  
  12. WITH x_addresses AS (
  13.   SELECT ROWNUM rn, address,
  14.   REGEXP_REPLACE(address, '[1-9a-zA-Z][0-9a-zA-Z]*', 'X') x_ip
  15.   FROM ipv6
  16. ),
  17. chains AS (
  18.   SELECT rn, address, x_ip, occurence,
  19.   REGEXP_SUBSTR(x_ip, '(:?0:?)+', 1, occurence) chain
  20.   FROM x_addresses CROSS JOIN
  21.   (SELECT LEVEL occurence FROM dual CONNECT BY LEVEL <= 8)
  22.   WHERE REGEXP_SUBSTR(x_ip, '(:?0:?)+', 1, occurence) IS NOT NULL OR occurence = 1
  23.   ORDER BY rn, REGEXP_COUNT(chain, '0') DESC, occurence
  24. ),
  25. max_chains AS (
  26. SELECT rn, address, x_ip, occurence, chain
  27. FROM (
  28.   SELECT rn, address, x_ip, occurence, chain,
  29.   ROW_NUMBER() OVER (PARTITION BY rn ORDER BY REGEXP_COUNT(chain, '0') DESC, occurence) grnum
  30.   FROM chains)
  31. WHERE grnum = 1
  32. )
  33.  
  34. SELECT address,
  35. REGEXP_REPLACE(address, chain, '::', 1, 1) normalized_address
  36. FROM max_chains;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement