繁体   English   中英

Oracle SQL - 选择大数作为十六进制字符串

[英]Oracle SQL - Select large number as hex string

我有一张表,其中一列是数字。 如何选择此列作为十六进制字符串?

我尝试使用to_char(my_column, 'xxxx')但这不是我想要的,因为我想要选择的列并不总是具有相同的值,并且to_char的第二个参数需要与输出十六进制的大小完全相同细绳。 老实说,我觉得这很愚蠢,因为您需要在调用to_char之前知道to_char的返回值才能构造它的第二个参数。

使用带有TO_CHARfm格式模型,它将TO_CHAR前导空格,然后只包含足够的X字符以显示您需要容纳的最大值:

SELECT value,
       TO_CHAR(
         value,
         'fmXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
       ) AS hex_value
FROM   table_name
ORDER BY value;

其中测试数据:

INSERT INTO table_name ( value )
SELECT POWER( 2, 4 * (LEVEL-1) ) FROM DUAL CONNECT BY LEVEL <= 20 UNION ALL
SELECT POWER( 2, 4 * (LEVEL-1) ) - 1 FROM DUAL CONNECT BY LEVEL <= 20;

输出:

\n                  价值 |  HEX_VALUE           \n ---------------: |  :--------------------\n                       0 |  0                   \n                       1 |  1                   \n                      15 |  F                   \n                      16 |  10                  \n                    第255话 FF                  \n                    第256话 100                 \n                    4095 |  FFF                 \n                    4096 |  1000                \n                   65535 |  FFFF                \n                   65536 |  10000               \n                 1048575 |  FFFFF               \n                 1048576 |  100000              \n                16777215 |  FFFFFF              \n                16777216 |  1000000             \n               268435455 |  FFFFFF             \n               268435456 |  10000000            \n              4294967295 |  FFFFFFFF            \n              4294967296 |  100000000           \n             68719476735 |  FFFFFFFF           \n             68719476736 |  1000000000          \n           1099511627775 |  FFFFFFFFFF          \n           1099511627776 |  10000000000         \n          17592186044415 |  FFFFFFFFFF         \n          17592186044416 |  100000000000        \n         281474976710655 |  FFFFFFFFFFFF        \n         281474976710656 |  1000000000000       \n        4503599627370495 |  FFFFFFFFFFFF       \n        4503599627370496 |  10000000000000      \n       72057594037927935 |  FFFFFFFFFFFFFF      \n       72057594037927936 |  100000000000000     \n     1152921504606846975 |  FFFFFFFFFFFFFF     \n     1152921504606846976 |  1000000000000000    \n    18446744073709551615 |  FFFFFFFFFFFFFFFF    \n    18446744073709551616 |  10000000000000000   \n   295147905179352825855 |  FFFFFFFFFFFFFFFF   \n   295147905179352825856 |  100000000000000000  \n  4722366482869645213695 |  FFFFFFFFFFFFFFFFFF  \n  4722366482869645213696 |  1000000000000000000 \n 75557863725914323419135 |  FFFFFFFFFFFFFFFFFF \n 75557863725914323419136 |  10000000000000000000\n

db<> 在这里摆弄

格式掩码的大小并不总是与十六进制值的字符数相同。 您可以使用大格式掩码(大量 x),然后使用LTRIM删除多余的空格。

WITH
    strings (string_val)
    AS
        (SELECT '28' FROM DUAL
         UNION ALL
         SELECT '589' FROM DUAL)
SELECT string_val, LTRIM (TO_CHAR (string_val, 'XXXXXXXXXXXXXXXX')) as hex_value
  FROM strings;



   STRING_VAL    HEX_VALUE
_____________ ____________
28            1C
589           24D

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM