SQL为数据分配/生成唯一的颜色

时间:2012-09-01 08:40:00

标签: sql sql-server-2008 colors unique

我有一个返回许多字符串值的查询。我需要为每个唯一值指定一种颜色,但我无法知道将有多少唯一值或以什么顺序。以下是查询返回的内容:

   |    ID    |    Value    |   Colour   | 
         1         XF452          ?
         2         ALL1F5         ?
         3         NULL           ?
         1         XF452
         2         BD4F
         3         NULL
         1         XF452
         2         XF452
         3         XF452

我想为每个不同的值指定一种颜色,以便最终看起来像这样:

   |    ID    |    Value    |   Colour   | 
         1         XF452        #880010
         2         ALL1F5       #FF0000
         3         NULL         #8C8C8C
         1         XF452        #880010
         2         BD4F         #002871
         3         NULL         #8C8C8C
         1         XF452        #880010
         2         XF452        #880010
         3         XF452        #880010

我已经通过获取Value列的unicode值并在开头附加'#'来实现这一点,但颜色变化非常小 - 大多数只是相同颜色的不同色调。有没有人有更好的想法?

4 个答案:

答案 0 :(得分:1)

您可以使用子查询获取每个值并使用以下任何方法为其指定颜色:

SELECT value, getMyColour() AS colour FROM table GROUP BY value;

然后,您可以将此子查询连接到原始表以获取值:

SELECT table.id, table.value, subq.colour 
FROM table, 
    (SELECT value, getMyColour() AS colour FROM table GROUP BY value) subq
WHERE table.value = subq.value

答案 1 :(得分:0)

我建议的是,

从表中获取不同的值到临时表。

create table #temp(value varchar(10),color_code varchar(100))

insert into #temp
select distinct value,getcolor from yourtable

现在你只需要加入像这样的表

update u SET Color=t.color_code from yourtable u join #temp t
on u.value=t.value

答案 2 :(得分:0)

一种方法是使用NEWID()。下面是一个将随机4字节值分配给information_schema.columns中的表的示例:

select max(cast(NEWID() as BINARY(4))) over (partition by table_name), table_name
from INFORMATION_SCHEMA.COLUMNS

cast(NEWID() as BINARY(4))表达式产生一个随机的4字节值。 max() over (partition . . .)为具有相同table_name的所有内容分配相同的值(在本例中)。您将使用以下表达式:

select max(cast(NEWID() as BINARY(4))) over (partition by value)

顺便说一下,如果你想要渐变颜色而不是随机颜色,我会考虑像:

select cast((dense_rank(value) over (partition by value))/(select count(distinct value)*1.0 from table)*power(2.0, 32) as binary(4))

答案 3 :(得分:0)

SET [Color] =  '#' +  CONVERT(VARCHAR(max), CRYPT_GEN_RANDOM(3), 2)