gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:59:20 27 4
gpt4 key购买 nike

我得到的分区数据有一组三列 - redgreenblue。分别为不同规划区域填充颜色的R、G、B值。

在原始表中它们是 VARCHAR,但我将它们转换为 INT,因为 RGB 中的 R、G 和 B 值通常是 8 位(否则随时你想将这些值用于它们的实际目的你最终会陷入双冒号 hell - 更多的冒号一定是不好的,对吧?)。

所以无论如何,对于表示层的东西,我需要 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 相比看起来真的 super 笨拙

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

其中 a = (red,green,blue) 通过 cursor.execute 从数据库中提取。

每个 PostgreSQL 变体上的 lpad() 都是获得有效的十六进制颜色所必需的:要了解原因,请在没有 lpad 的情况下转换 (5,189,94) 或 (0,204,153) - ing,并将结果(分别为#5BDC2 和#0CC99/#CC99)放入颜色检查器中。

upper() 只是我对颜色代码中全部大写的偏好;上面的 Python eval() 给出了全部大写。

现在的问题是:在 PostgreSQL 中是否有更简洁的方法来执行此操作,而无需编写实现我上面概述的两个变体之一的函数?

让它成为一个函数会很简单,但如果已经有 native 功能(查询中或以更简洁的方式将其编码为函数),了解它会很有用。

环境: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 上运行。

关于PostgreSQL:数字到 2 位十六进制的更整洁的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38317954/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com