您可以使用该SUBSTRING_INDEX
函数提取逗号之间的各个整数值。
SET @rgb := 'rgb(190,29,209)' ;
SELECT @rgb
, @rgbv := SUBSTRING_INDEX(SUBSTRING_INDEX(@rgb,'rgb(',-1),')',1) AS `@rgbv`
, @v1 := SUBSTRING_INDEX(@rgbv,',',1) AS `@v1`
, @v2 := SUBSTRING_INDEX(SUBSTRING_INDEX(@rgbv,',',2),',',-1) AS `@v2`
, @v3 := SUBSTRING_INDEX(SUBSTRING_INDEX(@rgbv,',',3),',',-1) AS `@v3`
, 0 + @v1 AS R
, 0 + @v2 AS G
, 0 + @v3 AS B
SELECT 列表中的最后三列表明用户变量可以在其他(后续)表达式中使用,在这种情况下,将它们添加到整数值 0 以将它们作为整数返回。
不幸的是,MySQL 不提供GREATEST
和LEAST
功能。这些会很方便,因此您可以使用如下表达式获得 Hue 的值:
GREATEST(0+@v1,0+@v2,0+@v3) - LEAST(0+@v1,0+@v2,0+@v3)
您可以为三个值“滚动自己的”最大和最小函数:
IF(0+@v1>0+@v2
,IF(0+@v1>0+@v3,0+@v1,IF(0+@v2>0+@v3,0+@v2,0+@v3))
,IF(0+@v2>0+@v3,0+@v2,0+@v3)
) AS `max(R,G,B)`
IF(0+@v1<0+@v2
,IF(0+@v1<0+@v3,0+@v1,IF(0+@v2<0+@v3,0+@v2,0+@v3))
,IF(0+@v2<0+@v3,0+@v2,0+@v3)
) AS `min(R,G,B)`
从包含名为 rgb 的列的表中,查询可能如下所示:
SELECT s.R
, s.G
, s.B
, IF(s.R>s.G,IF(s.R>s.B,s.R,s.B),IF(s.G>s.B,s.G,s.B)) AS `max(R,G,B)`
, IF(s.R<s.G,IF(s.R<s.B,s.R,s.B),IF(s.G<s.B,s.G,s.B)) AS `min(R,G,B)`
FROM (
SELECT t.rgb
, @rgbv := SUBSTRING_INDEX(SUBSTRING_INDEX(t.rgb,'rgb(',-1),')',1) AS `@rgbv`
, @v1 := SUBSTRING_INDEX(@rgbv,',',1) AS `@v1`
, @v2 := SUBSTRING_INDEX(SUBSTRING_INDEX(@rgbv,',',2),',',-1) AS `@v2`
, @v3 := SUBSTRING_INDEX(SUBSTRING_INDEX(@rgbv,',',3),',',-1) AS `@v3`
, 0 + @v1 AS v1
, 0 + @v2 AS v2
, 0 + @v3 AS v3
FROM mytable t
) s