PL/SQL十六进制转数字语句转Superset/Trino实现求助
问题解决:PL/SQL转Trino的16进制字符串转数值语句
首先,你的核心问题是Trino中错误用substr(2)模拟PL/SQL的substr(-16)逻辑,导致截取的字符串片段不符,进而转换结果错误。
原PL/SQL逻辑拆解
substr('D0023377B23DB783',-16)的作用是取字符串的最后16个字符:
- 若原字符串长度≥16,返回末尾16个字符;
- 若原字符串长度=16,返回整个字符串。
你的Trino语句错误点
substr('D0023377B23DB783', 2)是从第2个字符开始截取到末尾,这和“取最后16个字符”的逻辑完全不匹配:
- 当原字符串长度为16时,
substr(2)会去掉第一个字符,返回15个字符的片段,自然和原结果差异极大。
正确的Trino语句
Trino提供了right()函数,可以直接取字符串的最后N个字符,完美对应PL/SQL的substr(string, -N):
select from_base(right('D0023377B23DB783', 16), 16);
额外说明
如果转换后的数值超出Trino的BIGINT范围(-9223372036854775808 ~ 9223372036854775807),from_base()会自动返回DECIMAL类型,确保大数值不会溢出,和PL/SQL的to_number()行为一致。
内容的提问来源于stack exchange,提问作者Ana Pinheiro Torres
相关产品推荐
相关产品推荐

