2012-09-13 1 views
1

나는이마이그레이션 RGB 값은

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

처럼 보이는 MySQL의 DB를 가지고 있고이

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

가장 큰 문제처럼 보이는 DB를 생성 할 필요가 나는이 값을 추출하기 위해 rgb(x,y,z)을 구문 분석합니다.

+0

변환을 수행하려면 프로그램이 필요할 것입니다. 단순히 target_color_r, target_color_g 및 target_color_b 만 있으면 쉽게 사용할 수 있습니다. – Neil

+0

안녕하세요! 고마워, Neil, 내가 망쳐 놓은 것을 알기 때문에 가능한 한 빨리 그 길을 찾아 내려고 노력 중이다. – tdmartin

+0

그런 식으로 생각하지 마라. 빠른 해결책을 찾는 것만 큼 그렇게해야한다고 말하지는 않습니다. rgb (###, ###, ###) 구문 분석은 값을 구문 분석하고 각각의 색조, 채도 및 밝기로 변환하는 것보다 쉬워야합니다. – Neil

답변

1

당신은 각각의 정수를 뽑아 위해 SUBSTRING_INDEX 기능을 사용할 수 있습니다 ... 나는 정규식 트릭을 할 것이라고 생각하지만, 그들은 MySQL은 지원되지 않습니다 ... 물론 substrint()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은 GREATESTLEAST 기능을 제공하지 않습니다. 당신은 세 가지 값을 최대 및 최소 기능 "자신의 롤"수

GREATEST([email protected],[email protected],[email protected]) - LEAST([email protected],[email protected],[email protected]) 

:

IF([email protected]>[email protected] 
    ,IF([email protected]>[email protected],[email protected],IF([email protected]>[email protected],[email protected],[email protected])) 
    ,IF([email protected]>[email protected],[email protected],[email protected]) 
) AS `max(R,G,B)` 

IF([email protected]<[email protected] 
    ,IF([email protected]<[email protected],[email protected],IF([email protected]<[email protected],[email protected],[email protected])) 
    ,IF([email protected]<[email protected],[email protected],[email protected]) 
) 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 
+0

굉장! 여기에서 HSL은 매우 쉽습니다! – tdmartin

0

을 현장 감안할 때 그 사기꾼 커튼과 'rgb(190,29,209)'는이 SQL로 그 세 값을 추출 할 수 있습니다, rgb라고 :

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 
0

내가 직접 진수로 CSV의 RGB 값을 변환하려면이 옵션을 사용했다.

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')); 

은 분명히이 다른 사람을 도움 :) 희망 테이블 이름을 변경합니다.