Конвертировать имена цветов в RGB - PullRequest
3 голосов
/ 21 апреля 2011

У меня есть таблица записей, в каждой из которых хранится имя цвета.Например:

Product    |  Colour
-------------------
Product A  |  Blue
Product B  |  Black

Я добавил 3 новых столбца: R, G и B. Как я могу преобразовать цвета в значения RGB, используя один запрос SQL?

Ответы [ 3 ]

3 голосов
/ 21 апреля 2011
;with Colours(Name, R, G, B) as
(
  select 'White',   255, 255, 255 union all
  select 'Silver',  192, 192, 192 union all
  select 'Gray',    128, 128, 128 union all
  select 'Black',   0  , 0  , 0   union all
  select 'Red',     255, 0  , 0   union all
  select 'Maroon',  128, 0  , 0   union all
  select 'Yellow',  255, 255, 0   union all
  select 'Olive',   128, 128, 0   union all
  select 'Lime',    0  , 255, 0   union all
  select 'Green',   0  , 128, 0   union all
  select 'Aqua',    0  , 255, 255 union all
  select 'Teal',    0  , 128, 128 union all
  select 'Blue',    0  , 0  , 255 union all
  select 'Navy',    0  , 0  , 128 union all
  select 'Fuchsia', 255, 0  , 255 union all
  select 'Purple',  128, 0  , 128
)
update P set
  R = C.R,
  G = C.G,
  B = C.B
from products as P
  inner join Colours as C
    on P.Colour = C.Name
2 голосов
/ 21 апреля 2011

Вам нужно будет самостоятельно добавить значения RGB для соответствующего имени, нет способа извлечь эту информацию из имени цвета (в конце концов, что представляет собой «Темно-синий»?).

Вы можете использовать CSS-имена для подсказок при создании исходной справочной таблицы.

1 голос
/ 21 апреля 2011

Вам необходимо декодировать цвета в значения RGB в том же запросе, который используется для обновления таблицы.Пока вы не используете никаких функций, переменных или других таблиц, это можно сделать с помощью выражения CASE.Это не элегантное решение, но оно будет работать.

UPDATE products
SET
    r = (CASE colour
            WHEN 'Black' THEN 0
            WHEN 'Red' THEN 255
            WHEN 'Green' THEN 0
            WHEN 'Blue' THEN 0
            WHEN 'White' THEN 255
            ELSE NULL
        END),
    g = (CASE colour
            WHEN 'Black' THEN 0
            WHEN 'Red' THEN 0
            WHEN 'Green' THEN 255
            WHEN 'Blue' THEN 0
            WHEN 'White' THEN 255
            ELSE NULL
        END),
    b = (CASE colour
            WHEN 'Black' THEN 0
            WHEN 'Red' THEN 0
            WHEN 'Green' THEN 0
            WHEN 'Blue' THEN 255
            WHEN 'White' THEN 255
            ELSE NULL
        END)

Или может быть следующим образом:

UPDATE products
SET
    r = (CASE
            WHEN Colour IN ('Black', 'Green', 'Blue') THEN 0
            WHEN Colour IN ('Red', 'White') THEN 255
            ELSE NULL
        END),
    g = (CASE
            WHEN Colour IN ('Black', 'Red', 'Blue') THEN 0
            WHEN Colour IN ('Green', 'White') THEN 255
            ELSE NULL
        END),
    b = (CASE
            WHEN Colour IN ('Black', 'Red', 'Green') THEN 0
            WHEN Colour IN ('Blue', 'White') THEN 255
            ELSE NULL
        END)
...