在搭建数仓的过程中,出现源数据ID格式为UUID。必须保留原值,而且目标表格式为numeric且不能修改。
字母转换数字
所以需要想办法把字母转换成数字,从网上搜了一些方法,没有看到比较合适的。然后就考虑是否可以将字母转换成二进制再转换成十进制,变成数字格式。
首先考虑的是先把字符串转换进制,这里是先转换2进制,再转换成16进制。使用::bytea转换格式 为二进制,然后使用encode函数转换成16进制。当转换成16进制的时候,字母就可以显示成数字(强行转换十进制有时候会因为数字太长无法转换)。如下:
SELECT 'ef'::bytea
-- (BLOB) 2 bytes
SELECT encode('ef'::bytea, 'hex')
-- 6566
这里可以看出,转换二进制时是每个字符进行转换,e的16进制为0x65,f的16进制为0x66
汉字和特殊字符转换成数字
上面的用法中可以把字母转换成数字,但是如果字段中出现汉字和特殊字符,转换一次16进制后并不能变成数字。
这里就有不同的方式实现了,如果出现的汉字和特殊字符情况不多,可以把特殊数据单独处理,或者将特殊字符、汉字等替换成其他字母或空字符串。然后转换,这就需要看具体情况了。
如果不能替换,特殊情况太多,就只能再套一层处理,相对的字段值也会变的比较长,如下:
SELECT encode('--[/'::bytea, 'hex')
-- 2d2d5b2f
SELECT encode(encode('--[/'::bytea, 'hex')::bytea, 'hex')
-- 3264326435623266
这样就解决了字符串想要强行转换成数字的问题。
