PostgreSQL:数字到2位十六进制的整洁转换

PostgreSQL:数字到2位十六进制的整洁转换,postgresql,Postgresql,我得到的分区数据有一组三列——红色、绿色和蓝色。它们分别是不同规划区填充颜色的R、G和B值 在原始表中,它们是VARCHAR,但我将它们转换为INT,因为RGB中的R、G和B值在规范上是8位的,否则,任何时候你想将这些值用于它们的实际用途,你就会陷入双冒号地狱——而且更多的冒号肯定是坏的,对吧 所以无论如何,对于表示层的东西,我需要RGB作为十六进制颜色,即000000-FFFFFF 我知道两种方法: upper('#'||lpad(to_hex(red)::text,2,'0')||lpad(

我得到的分区数据有一组三列——红色、绿色和蓝色。它们分别是不同规划区填充颜色的R、G和B值

在原始表中,它们是VARCHAR,但我将它们转换为INT,因为RGB中的R、G和B值在规范上是8位的,否则,任何时候你想将这些值用于它们的实际用途,你就会陷入双冒号地狱——而且更多的冒号肯定是坏的,对吧

所以无论如何,对于表示层的东西,我需要RGB作为十六进制颜色,即000000-FFFFFF

我知道两种方法:

upper('#'||lpad(to_hex(red)::text,2,'0')||lpad(to_hex(green)::text,2,'0')||lpad(to_hex(blue)::text,2,'0'))

这两种方法都相当于冒号,与Python相比,它们看起来非常笨拙

'#%02x%02x%02x' % eval(a,)
其中a=通过游标从db中提取的红、绿、蓝。执行

每个PostgreSQL变体上的lpad都是获得有效十六进制颜色所必需的:要了解原因,请在不使用lpad的情况下转换5189、94或0204153,并将结果5BDC2和0CC99/CC99分别放入颜色检查器

鞋面正是我喜欢的所有颜色代码的帽子;上面的Python eval给出了allcaps

现在的问题是:在PostgreSQL中,有没有一种更省钱的方法来实现这一点,而不只是编写一个实现我上面概述的两个变体之一的函数

让它成为一个函数是很简单的,但如果查询中已经有了本机功能,或者用一种更省钱的方式将其编码为函数,那么了解它会很有用

环境:PostgreSQL 9.3.5 Windows

SELECT
    '#' || lpad(upper(to_hex((R << 16) | (G << 8) | B)), 6, '0')
FROM (
    SELECT
        1 AS R,
        28 AS G,
        123 AS B
    ) AS RGB;

不使用结肠;但是我有PostgreSQL 9.5,我希望它也能在9.3.5上运行。

当我输入完我自己的答案时,我看到了这样一句话:@Adam谢谢。哦!我应该考虑查看文档中的按位移位运算符——我在Python中使用了很多这种运算符,语法与PHP相同:Octave和R的语法完全不同。我可以确认该解决方案也适用于9.3.5。
SELECT
    '#' || lpad(upper(to_hex((R << 16) | (G << 8) | B)), 6, '0')
FROM (
    SELECT
        1 AS R,
        28 AS G,
        123 AS B
    ) AS RGB;