この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リストの最後の3列は、ユーザー変数を他の(後続の)式で使用できることを示しています。この場合、ユーザー変数を整数値0に追加して、整数として返します。
GREATEST
残念ながら、MySQLは機能を提供していませんLEAST
。これらは便利なので、次のような式でHueの値を取得できます。
GREATEST(0+@v1,0+@v2,0+@v3) - LEAST(0+@v1,0+@v2,0+@v3)
次の3つの値に対して、「独自の」最大および最小の関数をロールできます。
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