1

私はこのようなmysql dbを持っています

target_color       
'rgb(200,200,200)'
'rgb(190,29,209)'

そして、このようなデータベースを作成する必要があります

target_hue   ~   target_saturation  ~ target_lightness   ~   hex_value
10          ~    40        ~         40           ~         a567ff

rgb(x,y,z)私が直面している主な問題は、値を抽出するための解析です。正規表現でうまくいくと思いましたが、mysqlではサポートされていません...試しsubstrint()てみsubstring_index()ましたが、完全に絡まりました...

4

3 に答える 3

1

この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
于 2012-09-13T16:20:28.747 に答える
0

を含むフィールドが'rgb(190,29,209)'と呼ばれるrgb場合、次の sql を使用してこれら 3 つの値を抽出できます。

select 
   substring(rgb, locate('(',rgb)+1,locate(',',rgb) -1 - locate('(',rgb)) as red,
   substring(substring_index(rgb,',',2) , locate(',',rgb)+1) as green,
   substring(rgb, locate(',',rgb, locate(',',rgb)+1 )+1 , locate(')',rgb) 
                   -1 - locate(',',rgb, locate(',',rgb)+1 )) as blue

この結果セットを出力します:

red  green  blue
190  29     209
于 2012-09-13T16:48:22.000 に答える
0

これを使用して、csv RGB 値を直接 16 進数に変換しました。

UPDATE table1 ami
JOIN 
(
SELECT id, value 
, SUBSTRING(value, 1, LOCATE(',', value)-1) as R
, SUBSTRING(value, LOCATE(',', value)+1, LOCATE(',', value, LOCATE(',', value)+1) - LOCATE(',', value) - 1) G
, SUBSTRING(value, LOCATE(',', value, LOCATE(',', value)+1)+1) B
from table1 ai
where locate(',', value) > 0
) tbl ON ami.id = tbl.id
SET ami.value = CONCAT(
 LPAD(CONV(tbl.R, 10, 16),2,'0') 
, LPAD(CONV(tbl.G, 10, 16),2,'0')
, LPAD(CONV(tbl.B, 10, 16),2,'0'));

明らかにテーブル名を変更してください:)これが他の誰かに役立つことを願っています。

于 2014-10-24T13:54:15.123 に答える