我的Postgres数据库中有一个64位整数字段,其中填充了64位整数。 (非)巧合的是,这些数字实际上是ASCII格式的8个字符串,小端。例如,数字5208208757389214273是字符串“ABCDEFGH”的数字表示形式:十六进制为0x4847464544434241,其中0x41为A,0x42为B,0x43为C等等。
我想将这些数字完全转换为显示目的 - 即找到一种方法将它们作为数字留在数据库中,但是在查询时能够将它们看作字符串。有没有办法在SQL中做到这一点?如果不是在SQL中,我可以在服务器端做什么(安装扩展,存储过程,任何东西),这将允许这样做?这个问题可以通过任何脚本或编程语言轻松解决,但我不知道如何用SQL解决它。
P.S。还有一次触发快乐的重复锤子产生一堆 - 这不是将数字翻译为5208208757389214273到字符串“5208208757389214273”的问题(我们有很多关于如何做到这一点的答案,但这不是我在寻找什么。)
答案 0 :(得分:2)
使用Clubs::find ()
->alias ( 'c' )
->select ( [ new \yii\db\Expression ( 'c.[[id]], count(cu.[[id]]) as total' ) ] )
->joinWith( ['clubUsers cu'] )
->groupBy ( 'c.id' )
->all ();
获取数字的十六进制表示。然后使用to_hex()
将其转换为decode()
。 (很遗憾,我没有找到从bytea
到bigint
的任何直接方式。)由于字节顺序,将其投放到bytea
和text
。
reverse()
reverse(decode(to_hex(5208208757389214273), 'hex')::text)
ABCDEFGH
必须设置为bytea_output
才能正常使用 - 使用'escape'
。
(在版本9.4和9.6上测试。)
在不使用SET bytea_output = 'escape';
的情况下实现相同的rsult的另一种方法如下:
SET