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

时间:2016-07-11 23:53:44

标签: postgresql

我获得的分区数据包含三列 - redgreenblue。它们分别是不同规划区域的填充颜色的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'))

upper('#'||lpad(to_hex(((red * 65536) + (green * 256) + blue))::text,6,'0'))

与Python相比,这两者都非常冒号,看起来真的超级大胆

'#%02x%02x%02x' % eval(a,)

其中a =(红色,绿色,蓝色)从数据库中提取cursor.execute

每个PostgreSQL变体上的lpad()对于获得有效的十六进制颜色是必要的:要查看原因,转换(5,189,94)或(0,204,153)而不使用lpad,并将结果(# 5BDC2和#0CC99 /#CC99分别成为颜色检查器。

upper()只是我对颜色代码中所有大写字母的偏好;上面的Python eval()给出了allcaps。

现在的问题是:在PostgreSQL中是否有一种更简约的方法可以实现这一点而不只是编写一个函数来实现我上面概述的两个变体之一?

使它成为一个函数将是直截了当的,但如果已经有本机功能(在查询中或以更简约的方式将其编码为函数),那么知道它将是有用的。

环境:PostgreSQL 9.3.5(Windows)。

1 个答案:

答案 0 :(得分:4)

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。