这对我来说很难,因为SQL不是我最好的技能;)
我必须在数据库行中插入随机的十六进制颜色。我该怎么做?是否可以创建将绘制数字的函数?
答案 0 :(得分:25)
SET [Color] = '#' + CONVERT(VARCHAR(max), CRYPT_GEN_RANDOM(3), 2)
答案 1 :(得分:17)
下面介绍的逻辑包含在MySQL的一个函数中。它非常易于使用。
mysql> select random_color();
+----------------+
| random_color() |
+----------------+
| #8F50B4 |
+----------------+
1 row in set (0.00 sec)
它可以反复调用,每次都会有不同的颜色。
CREATE FUNCTION `random_color`() RETURNS char(7) CHARSET latin1 DETERMINISTIC
BEGIN
DECLARE str CHAR(7);
SET str = concat('#',SUBSTRING((lpad(hex(round(rand() * 10000000)),6,0)),-6));
RETURN str;
END;
这将为您提供MySQL中的六位十六进制数字代码
SELECT concat('#',SUBSTRING((lpad(hex(round(rand() * 10000000)),6,0)),-6))
这是一个很棒的颜色
SELECT *,
concat('#',SUBSTRING((lpad(hex(@curRow := @curRow + 10),6,0)),-6)) AS color
FROM table
INNER JOIN (SELECT @curRow := 5426175) color_start_point
答案 2 :(得分:3)
这在 MySQL中对我有效:
mysql> SELECT CONCAT('#',LPAD(CONV(ROUND(RAND()*16777215),10,16),6,0)) AS color;
+---------+
| color |
+---------+
| #0E74A9 |
+---------+
1 row in set (0.00 sec)
简短说明:
RAND()
和ROUND()
'ed可得出RGB颜色范围内的随机无符号整数:(0,2 24 -1)LPAD()
左移零填充CONCAT()
得到'#'
字符答案 3 :(得分:2)
with cte1 as (
select round(round(rand(),1)*15,0) as hex1,
round(round(rand(),1)*15,0) as hex2,
round(round(rand(),1)*15,0) as hex3,
round(round(rand(),1)*15,0) as hex4,
round(round(rand(),1)*15,0) as hex5,
round(round(rand(),1)*15,0) as hex6
),
cte2 as (
select case when hex1 = 10 then 'A'
when hex1 = 11 then 'B'
when hex1 = 12 then 'C'
when hex1 = 13 then 'D'
when hex1 = 14 then 'E'
when hex1 = 15 then 'F'
else str(hex1) end as hex1h,
case when hex2 = 10 then 'A'
when hex2 = 11 then 'B'
when hex2 = 12 then 'C'
when hex2 = 13 then 'D'
when hex2 = 14 then 'E'
when hex2 = 15 then 'F'
else str(hex2) end as hex2h,
case when hex3 = 10 then 'A'
when hex3 = 11 then 'B'
when hex3 = 12 then 'C'
when hex3 = 13 then 'D'
when hex3 = 14 then 'E'
when hex3 = 15 then 'F'
else str(hex3) end as hex3h,
case when hex4 = 10 then 'A'
when hex4 = 11 then 'B'
when hex4 = 12 then 'C'
when hex4 = 13 then 'D'
when hex4 = 14 then 'E'
when hex4 = 15 then 'F'
else str(hex4) end as hex4h,
case when hex5 = 10 then 'A'
when hex5 = 11 then 'B'
when hex5 = 12 then 'C'
when hex5 = 13 then 'D'
when hex5 = 14 then 'E'
when hex5 = 15 then 'F'
else str(hex5) end as hex5h,
case when hex6 = 10 then 'A'
when hex6 = 11 then 'B'
when hex6 = 12 then 'C'
when hex6 = 13 then 'D'
when hex6 = 14 then 'E'
when hex6 = 15 then 'F'
else str(hex6) end as hex6h from cte1)
select '#'+ltrim(hex1h)+ltrim(hex2h)+ltrim(hex3h)+ltrim(hex4h)+ltrim(hex5h)+ltrim(hex6h) from cte2
答案 4 :(得分:1)
这是一个SQL Server函数,它适用于2012年以后的所有版本,它们生成十六进制格式的随机HTML颜色代码,即#AABB00。它也需要一个View,这也在下面提供。
该功能为您提供了避免浅色或深色的选项,如果您尝试生成不会太严重的背景和前景色(即深色背景上的深色文本),这将非常有用。
CREATE FUNCTION dbo.Get_Random_Colour (@intStyle tinyint = 0)
RETURNS varchar(7)
/*
* Purpose: Returns the HTML colour code for a random colour
* Inputs: @intStyle - 0: does not filter the colour range
* 1: avoid dark colours
* 2: avoid light colours
*/
AS
BEGIN
DECLARE @c1 char(2), @c2 char(2), @c3 char(2)
DECLARE @i1 tinyint, @i2 tinyint, @i3 tinyint
DECLARE @strResult As varchar(255)
DECLARE @intLow tinyint = 0
DECLARE @intHigh tinyint = 255
IF @intStyle = 1
SET @intLow = 80
IF @intStyle = 2
SET @intHigh = 140
--Generate random numbers
SELECT @i1 = CAST(ROUND((@intHigh-@intLow) * RandNumber + @intLow,0) as int) from dbo.vRandNumber
SELECT @i2 = CAST(ROUND((@intHigh-@intLow) * RandNumber + @intLow,0) as int) from dbo.vRandNumber
SELECT @i3 = CAST(ROUND((@intHigh-@intLow) * RandNumber + @intLow,0) as int) from dbo.vRandNumber
--Convert them to hex format
SELECT @c1 = FORMAT(@i1, 'X')
SELECT @c2 = FORMAT(@i2, 'X')
SELECT @c3 = FORMAT(@i3, 'X')
--Pad them to two characters
SELECT @strResult = '#'
+ REPLICATE('0', 2-LEN(@c1)) + @c1
+ REPLICATE('0', 2-LEN(@c2)) + @c2
+ REPLICATE('0', 2-LEN(@c3)) + @c3
RETURN @strResult
END
GO
以下是函数依赖的视图:
CREATE VIEW [dbo].[vRandNumber]
AS
SELECT RAND() as RandNumber
答案 5 :(得分:1)
我不确定您使用的是哪个DBMS,但此解决方案适用于SQL Server,如果您知道相应的语法和功能,则可以应用于其他DBMS。
(我会尽量简短地说明)
十六进制颜色基本上是十六进制VARBINARY
值,几乎所有DBMS都支持这些值。您只需要正确的转换即可将其绑定到您的需求。
例如,如果我们将字符串foo
转换为VARBINARY
,它将返回0x666F6F
的值,如果我们将其转回VARCHAR
,则为&#39} ; ll返回foo
SELECT CAST('foo' AS VARBINARY)
-- Returns : 0x666F6F
SELECT CAST(0x666F6F AS VARCHAR)
-- Returns : foo
因此,即使输出不同,它也与相应的数据类型具有相同的值。这也适用于颜色(十六进制到rgb,rgb到十六进制,十六进制到二进制等)。
现在,您知道Hex颜色正在使用VARBINARY
数据类型,这将是此解决方案中的目标。
第一件事是使用RGB值(这是INT值的另一种数据类型)生成VARBINARY
。 RGB值是表示红色,绿色和蓝色的三个不同值。每个最小数量为0,最大值为255.因此,如果我们执行RGB(0,0,0)
,则返回#000000
(黑色),RGB(255,255,255)
返回#FFFFFF
(白色) )。
哦,我忘记了,因为DBMS已经在处理这个问题,所以你不需要在这个转换中使用任何特殊的等式。
所以,你的第一个目标是做一个获取RGB值(最小0和最大255)的函数,然后将其转换为十六进制VARBINARY
,这将为您提供十六进制颜色。
要从RGB转换为十六进制,您需要知道每个2十六进制表示RGB值。例如#BA55D3
对应rgb(186,85,211)
它的实际十六进制是
在哪里
。因此,从每个Hex颜色,您需要将其分成3组,每组两个值来表示RGB值。
如果将0xBA转换为INT,它将给出186这是红色部分的值。
SELECT
CAST(0xBA AS INT)
-- Returns : 186
同样适用于其他人。
现在,我们需要我们的函数为我们完成工作,为此,我创建了一个函数,只需要三个int值并将它们转换为VARBINARY
,这有助于我将它转换回varchar到just将输出格式化为十六进制颜色值。
CREATE FUNCTION RGBToHex
(
@R INT,
@G INT,
@B INT
)
RETURNS VARCHAR(7)
AS
BEGIN
DECLARE
@VarR VARBINARY,
@VarG VARBINARY,
@VarB VARBINARY,
@Result VARCHAR(7)
SELECT
@VarR = CONVERT(VARBINARY, @R) * 1 ,
@VarG = CONVERT(VARBINARY, @G) * 1 ,
@VarB = CONVERT(VARBINARY, @B) * 1
SET @Result = '#' + SUBSTRING(Convert(VARCHAR(MAX),@VarR, 1), 3, 2) + SUBSTRING(Convert(VARCHAR(MAX),@VarG, 1), 3, 2) + SUBSTRING(Convert(VARCHAR(MAX),@VarB, 1), 3, 2)
RETURN @Result
END
示例:
SELECT
RGBToHex(186,85,211)
-- Returns : #BA55D3
现在,该函数已经可以使用了,我们需要的是一种在这个函数内随机化三个INT的方法,每次都得到一个随机颜色,记住RGB的最小值和最大值(0-255) 。
在SQL Server中我为了简单起见使用了递归查询,您可以使用自己的方法或函数进行自己的查询。
;WITH CTE AS (
SELECT
ABS(CHECKSUM(NewId())) % 256 AS R ,
ABS(CHECKSUM(NewId())) % 256 AS G ,
ABS(CHECKSUM(NewId())) % 256 AS B
)
SELECT
dbo.RGBToHex(R,G,B)
FROM CTE
在上面的查询中,我为每列设置了0-255之间的随机数,然后我将这些值放在函数中以生成新颜色。
如果您需要使用颜色的十六进制并返回RGB值的反转功能,您可以使用此功能:
CREATE FUNCTION HexToRGB
(
@Hex VARCHAR(7)
)
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE
@VarH VARCHAR(6),
@R INT,
@G INT,
@B INT,
@Result VARCHAR(100)
SET @VarH = (CASE WHEN LEFT(@Hex, 1) = '#' THEN SUBSTRING(@Hex, 2,6) ELSE @Hex END)
SELECT
@R = CONVERT(INT, CONVERT(VARBINARY, '0x' + SUBSTRING(@VarH, 1,2), 1) ),
@G = CONVERT(INT, CONVERT(VARBINARY, '0x' + SUBSTRING(@VarH, 3,2), 1) ),
@B = CONVERT(INT, CONVERT(VARBINARY, '0x' + SUBSTRING(@VarH, 5,2), 1) )
SET @Result = 'rgb(' + CAST(@R AS VARCHAR(3) ) + ',' + CAST(@G AS VARCHAR(3) ) + ',' + CAST(@B AS VARCHAR(3) ) + ')'
RETURN @Result
END
答案 6 :(得分:0)
猜猜你需要使用rand - https://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html#function_rand - 即
INSERT INTO ... VALUES ( ... , ROUND(RAND(255 * 255 * 255)), ...)
答案 7 :(得分:0)
这是PostgreSQL的解决方案。
SELECT concat('#',lpad(to_hex(round(random() * 10000000)::int4),6,'0'))
我使用它使用该代码将随机颜色设置为表格的Color
字段:
UPDATE "MyTable" SET "Color" = concat('#',lpad(to_hex(round(random() * 10000000)::int8),6,'0'));
答案 8 :(得分:0)
对于所有SQL查询(MySql,SQL Server等),此方法均有效
在sql中,我们可以使用substring
函数生成随机颜色。请记住,在sql charecter中,索引从 1 开始(不是0 ,例如javascript)
select concat('#',substring('0123456789ABCDEF',round(rand() * 15)+1,1),substring('0123456789ABCDEF',round(rand() * 15)+1,1),substring('0123456789ABCDEF',round(rand() * 15)+1,1),substring('0123456789ABCDEF',round(rand() * 15)+1,1),substring('0123456789ABCDEF',round(rand() * 15)+1,1),substring('0123456789ABCDEF',round(rand() * 15)+1,1));
round(rand() * 15)
给出0到15之间的随机数,包括0到15。这就是为什么我们向其添加1以获得1作为子字符串索引的最小值的原因
select concat('#',substring('0123456789ABCDEF',round(rand() * 8)+8,1),substring('0123456789ABCDEF',round(rand() * 15)+1,1),substring('0123456789ABCDEF',round(rand() * 8)+8,1),substring('0123456789ABCDEF',round(rand() * 15)+1,1),substring('0123456789ABCDEF',round(rand() * 8)+8,1),substring('0123456789ABCDEF',round(rand() * 15)+1,1));
select concat('#',substring('0123456789ABCDEF',round(rand() * 7)+1,1),substring('0123456789ABCDEF',round(rand() * 15)+1,1),substring('0123456789ABCDEF',round(rand() * 7)+1,1),substring('0123456789ABCDEF',round(rand() * 15)+1,1),substring('0123456789ABCDEF',round(rand() * 7)+1,1),substring('0123456789ABCDEF',round(rand() * 15)+1,1));
在上述所有情况下,我们都可以使用临时变量来获得重复范围值,以使查询最小化,例如
set @r='0123456789ABCDEF';
select concat('#',substring(@r,round(rand() * 15)+1,1),substring(@r,round(rand() * 15)+1,1),substring(@r,round(rand() * 15)+1,1),substring(@r,round(rand() * 15)+1,1),substring(@r,round(rand() * 15)+1,1),substring(@r,round(rand() * 15)+1,1));