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)
을 구문 분석합니다.
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)
을 구문 분석합니다.
당신은 각각의 정수를 뽑아 위해 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은 GREATEST
및 LEAST
기능을 제공하지 않습니다. 당신은 세 가지 값을 최대 및 최소 기능 "자신의 롤"수
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)`
, 쿼리는 다음과 같습니다
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
굉장! 여기에서 HSL은 매우 쉽습니다! – tdmartin
을 현장 감안할 때 그 사기꾼 커튼과 '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
내가 직접 진수로 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'));
은 분명히이 다른 사람을 도움 :) 희망 테이블 이름을 변경합니다.
변환을 수행하려면 프로그램이 필요할 것입니다. 단순히 target_color_r, target_color_g 및 target_color_b 만 있으면 쉽게 사용할 수 있습니다. – Neil
안녕하세요! 고마워, Neil, 내가 망쳐 놓은 것을 알기 때문에 가능한 한 빨리 그 길을 찾아 내려고 노력 중이다. – tdmartin
그런 식으로 생각하지 마라. 빠른 해결책을 찾는 것만 큼 그렇게해야한다고 말하지는 않습니다. rgb (###, ###, ###) 구문 분석은 값을 구문 분석하고 각각의 색조, 채도 및 밝기로 변환하는 것보다 쉬워야합니다. – Neil