Guest User

Untitled

a guest
Jan 17th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.52 KB | None | 0 0
  1. SQL> var NUM number;
  2. SQL> exec :NUM := 100000000;
  3.  
  4. PL/SQL procedure successfully completed.
  5.  
  6. SQL> SELECT SUM(value)
  7. FROM
  8. (SELECT POWER(2,LENGTH(TO_CHAR(:NUM))-level)*to_number(SUBSTR(TO_CHAR(:NUM),level,1),'FM9') AS value
  9. FROM DUAL
  10. CONNECT BY level <= LENGTH(TO_CHAR(:NUM))
  11. ); 2 3 4 5 6
  12.  
  13. SUM(VALUE)
  14. ----------
  15. 256
  16.  
  17. with bin2hex as (
  18. select '0000' as bin, '0' as hex from dual union all
  19. select '0001' as bin, '1' as hex from dual union all
  20. select '0010' as bin, '2' as hex from dual union all
  21. select '0011' as bin, '3' as hex from dual union all
  22. select '0100' as bin, '4' as hex from dual union all
  23. select '0101' as bin, '5' as hex from dual union all
  24. select '0110' as bin, '6' as hex from dual union all
  25. select '0111' as bin, '7' as hex from dual union all
  26. select '1000' as bin, '8' as hex from dual union all
  27. select '1001' as bin, '9' as hex from dual union all
  28. select '1010' as bin, 'A' as hex from dual union all
  29. select '1011' as bin, 'B' as hex from dual union all
  30. select '1100' as bin, 'C' as hex from dual union all
  31. select '1101' as bin, 'D' as hex from dual union all
  32. select '1110' as bin, 'E' as hex from dual union all
  33. select '1111' as bin, 'F' as hex from dual
  34. )
  35. select t.*, c1.bin as bin1, c2.bin as bin2, c1.hex as hex1, c2.hex as hex2,
  36. to_number(c2.hex||c1.hex, 'xx')
  37. from (select '10010010' as num from dual union all
  38. select '10010' from dual
  39. ) t left outer join
  40. bin2hex c1
  41. on substr('00000000'||t.num, -4) = c1.bin left outer join
  42. bin2hex c2
  43. on substr('00000000'||t.num, -8, 4) = c2.bin;
  44.  
  45. with data as (
  46. select '10.100.1.11' as str from dual
  47. ),
  48. t as (
  49. select level as pos,
  50. regexp_substr(str, '[^.]+', 1, level) as val
  51. from data
  52. connect by level <= regexp_count(str, '[^.]+')
  53. ),
  54. r (pos, val, len, lvl, pos_val) as (
  55. select pos, val, length(val), 0, 0
  56. from t
  57. union all
  58. select pos, val, len, lvl + 1,
  59. power(2, lvl) * substr(val, len - lvl, 1)
  60. from r
  61. where lvl < length(val)
  62. )
  63. select listagg(sum(pos_val), '.') within group (order by pos)
  64. from r
  65. group by pos;
  66.  
  67.  
  68. 2.4.1.3
  69.  
  70. with bin2hex as (
  71. select '0000' as bin, '0' as hex from dual union all
  72. select '0001' as bin, '1' as hex from dual union all
  73. select '0010' as bin, '2' as hex from dual union all
  74. select '0011' as bin, '3' as hex from dual union all
  75. select '0100' as bin, '4' as hex from dual union all
  76. select '0101' as bin, '5' as hex from dual union all
  77. select '0110' as bin, '6' as hex from dual union all
  78. select '0111' as bin, '7' as hex from dual union all
  79. select '1000' as bin, '8' as hex from dual union all
  80. select '1001' as bin, '9' as hex from dual union all
  81. select '1010' as bin, 'A' as hex from dual union all
  82. select '1011' as bin, 'B' as hex from dual union all
  83. select '1100' as bin, 'C' as hex from dual union all
  84. select '1101' as bin, 'D' as hex from dual union all
  85. select '1110' as bin, 'E' as hex from dual union all
  86. select '1111' as bin, 'F' as hex from dual
  87. )
  88. select LISTAGG(t.num,'.')WITHIN GROUP (order by row_label) as source,
  89. LISTAGG(c1.bin,'.') WITHIN GROUP (order by row_label) as bin1,
  90. LISTAGG(c2.bin,'.') WITHIN GROUP (order by row_label) as bin2,
  91. LISTAGG(c1.hex,'.')WITHIN GROUP (order by row_label) as hex,
  92. LISTAGG(to_number(c2.hex||c1.hex, 'xx') ,'.') WITHIN GROUP (order by row_label) as deci
  93. -- c1.bin as bin1, c2.bin as bin2, c1.hex as hex1, c2.hex as hex2,
  94. --to_number(c2.hex||c1.hex, 'xx')
  95. from (SELECT level as row_label,REGEXP_SUBSTR('10.100.1.11','[^.]+',1,LEVEL) AS num
  96. FROM dual
  97. CONNECT BY REGEXP_SUBSTR('10.100.1.11','[^.]+',1,LEVEL) IS NOT NULL
  98. ) t left outer join
  99. bin2hex c1
  100. on substr('00000000'||t.num, -4) = c1.bin left outer join
  101. bin2hex c2
  102. on substr('00000000'||t.num, -8, 4) = c2.bin;
  103.  
  104. SOURCE BIN1 BIN2 HEX DECI
  105. 10.100.1.11 0010.0100.0001.0011 0000.0000.0000.0000 2.4.1.3 2.4.1.3
  106.  
  107. with data as (
  108. select '10.100.1.11' as str from dual
  109. ),
  110. t as (
  111. select level as pos,
  112. lpad(regexp_substr(str, '[^.]+', 1, level), 16, '0') as val
  113. from data
  114. connect by level <= regexp_count(str, '[^.]+')
  115. ),
  116. r as (
  117. select power(2, level - 1) as digit_val,
  118. lpad(power(10, level - 1), 16, '0') as raw_val,
  119. lpad('0', 16, '0') as zero_val
  120. from dual
  121. connect by level <= 16
  122. )
  123. select listagg(sum(
  124. case when utl_raw.bit_and(t.val, r.raw_val) = r.zero_val then 0 else 1 end
  125. * r.digit_val), '.') within group (order by pos)
  126. from t
  127. cross join r
  128. group by pos;
  129.  
  130. 2.4.1.3
  131.  
  132. with bin2hex as (
  133. select '0000' as bin, '0' as hex from dual union all
  134. select '0001' as bin, '1' as hex from dual union all
  135. select '0010' as bin, '2' as hex from dual union all
  136. select '0011' as bin, '3' as hex from dual union all
  137. select '0100' as bin, '4' as hex from dual union all
  138. select '0101' as bin, '5' as hex from dual union all
  139. select '0110' as bin, '6' as hex from dual union all
  140. select '0111' as bin, '7' as hex from dual union all
  141. select '1000' as bin, '8' as hex from dual union all
  142. select '1001' as bin, '9' as hex from dual union all
  143. select '1010' as bin, 'A' as hex from dual union all
  144. select '1011' as bin, 'B' as hex from dual union all
  145. select '1100' as bin, 'C' as hex from dual union all
  146. select '1101' as bin, 'D' as hex from dual union all
  147. select '1110' as bin, 'E' as hex from dual union all
  148. select '1111' as bin, 'F' as hex from dual
  149. )
  150. select listagg(hex) within group (order by lv desc),
  151. to_number(listagg(hex) within group (order by lv desc), LPAD('x', max(lv), 'x'))
  152. from(
  153. select substr('0000'||num, -4*level, 4) bin, level lv
  154. from (select '1001010100000010111110010000000' num --change value here
  155. from dual
  156. ) a
  157. connect by level<=ceil(length(a.num)/4)) a
  158. join bin2hex b on b.bin=a.bin
  159.  
  160. with bit as (
  161. select '0' b from dual union all
  162. select '1' from dual
  163. ),
  164. bin2dec as (
  165. select b7.b || b6.b || b5.b || b4.b || b3.b || b2.b || b1.b || b0.b bin,
  166. b7.b*128+b6.b*64+b5.b*32+b4.b*16+b3.b*8+b2.b*4+b1.b*2+b0.b*1 dec
  167. from bit b0
  168. cross join bit b1
  169. cross join bit b2
  170. cross join bit b3
  171. cross join bit b4
  172. cross join bit b5
  173. cross join bit b6
  174. cross join bit b7
  175. ),
  176. testdata as (
  177. select '10010010' as num from dual union all
  178. select '10010' from dual
  179. )
  180.  
  181. select testdata.num, bin2dec.dec from testdata join bin2dec
  182. on substr('00000000'||testdata.num,-8) = bin2dec.bin
  183.  
  184. WITH INPUT AS
  185. (SELECT REVERSE('&N') AS X FROM DUAL)
  186. SELECT SUM(TO_NUMBER(SUBSTR(X,LEVEL,1)*POWER(2,LEVEL-1))) AS OUTPUT
  187. FROM INPUT CONNECT BY LEVEL<=LENGTH(X);
Add Comment
Please, Sign In to add comment