SQL将硬编码数组加入到结果1对1中

时间:2013-09-24 22:20:17

标签: sql postgresql colors

我正在尝试为查询提供一组颜色十六进制代码,我需要一个与每个结果对齐的值,如果它用完了,最好使用颜色列表循环。

我正在尝试将unnest(ARRAY[])的颜色硬编码为大约15-20个字符串。

UNNEST(ARRAY['9A2849', '0F910F', 'A3915D', 'D49D2F', 'E87B00',
    '09A6B3', '007DC3', '969696', '005788', '086908', '706545', 
    '996600', '801131', '606060', 'BA5004', '008596']) AS color

我无法使用JOIN,因为它们需要ON条款。

具体来说,我正在尝试为饼图提供一些合理的颜色,而不必在SQL中添加颜色表或创建某种随机颜色生成器。

是否有一种简单的方法可以添加一列与所选数据一对一排列的硬编码数据?如果是这样,在达到目的结束时是否容易使硬编码数据循环? (如果不是,我可以将选择限制为最大的25个结果,因为无论如何,在饼图上还会有任何细长。)

结果应该是这样的:

value | label                 | color
-----------------------------------------
2     | "A test for cloning"  | "9A2849"
6     | "Automobile Bays"     | "0F910F"
2     | "Break Rooms"         | "A3915D"
3     | "Common Areas"        | "D49D2F"

1 个答案:

答案 0 :(得分:3)

如何使用行数%%您拥有的颜色数量并加入其中:

SELECT *
FROM (SELECT *, row_number() OVER(ORDER BY numb DESC) AS POSITION FROM tab) t
JOIN (SELECT UNNEST( ARRAY['9A2849', '0F910F', 'A3915D', 'D49D2F', 'E87B00','09A6B3', '007DC3', '969696', '005788', '086908', '706545',
    '996600', '801131', '606060', 'BA5004', '008596']) AS color,  UNNEST( ARRAY[1, 2, 3, 4, 5,  6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]) AS numb
   ) x 
ON t.POSITION % 16 + 1 = x.numb;

http://www.sqlfiddle.com/#!1/00823/3

来自Mu的评论:

SELECT (ARRAY['9A2849', '0F910F', 'A3915D', 'D49D2F', 'E87B00','09A6B3', '007DC3', '969696', '005788', '086908', '706545',
    '996600', '801131', '606060', 'BA5004', '008596'])[t.position% 16 + 1] AS color, *
FROM (SELECT *, row_number() OVER(ORDER BY numb DESC) AS POSITION FROM tab) t

http://www.sqlfiddle.com/#!1/00823/10