2016-04-30 3 views
0

У меня есть таблица, к которой я добавил код цвета varchar.Обновить столбец таблицы на основе массива varchar в PostgreSQL

В таблице уже много строк. состояние таблицы после добавления колонки ColorCode является

id name    location  colorcode 
121 Royal Challengers Bangalore  
122 Sun Risers   Hyderabad 
123 Dare Devils  Delhi 
124 Gujrat Lions  Ahmadabad 

У меня есть массив цветовых кодов

["#FF8484", "#FF82A9", "#FA82FF", "#C682FF", "#8782FF"] 

Для каждой строки в таблице я должен обновить столбец ColorCode путем сопоставления индекса массива с (row_number () - 1).

Я применил список значений при использовании предложения «in».

пример:

select * from table where id in(1,2,3,4) etc 

здесь 1,2,3,4 нет ничего, кроме массива

Я хочу, чтобы обновить столбец ColorCode на подобных линий, но я не знаю, как получить доступ к элементы моего массива, основанные на индексе.

после запуска оператор обновления мой ожидается выход

id name    location  colorcode 
121 Royal Challengers Bangalore  #FF8484 
122 Sun Risers   Hyderabad  #FF82A9 
123 Dare Devils  Delhi   #FA82FF 
124 Gujrat Lions  Ahmedabad  #C682FF 

можно сортировать результат на основе идентификатора, т.е., первичный ключ

. Примечание: Я использую Postgres

+0

Каков ожидаемый результат обновления? Зачем вам нужно ссылаться на предыдущую строку? И как определяется «предыдущий»? На каком атрибуте вы можете сортировать строки? [edit] ваш вопрос и добавьте некоторые примеры данных и ожидаемый результат (текст _формат, пожалуйста, [без скриншотов] (http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images -of-code-on-so-when-ask-a-question/285557 # 285557)) –

+0

Я отредактировал вопрос и добавил ожидаемый результат обновления. Мне не нужно ссылаться на предыдущую строку. Row_number() - 1 должен убедиться, что цветовой код соответствует индексу массива row_number() равен 1, и индексы массива основаны на 0 (я думаю), поэтому, чтобы компенсировать это, я делаю row_number() -1. Вы можете сортировать строки на основе id – curiosa

ответ

2

Вы могли бы сделайте это следующим образом. Я предполагаю, что ваша таблица называется т:

update t 
set colorcode = middle.cc 
from (
     select id, ('{#FF8484,#FF82A9,#FA82FF,#C682FF,#8782FF}'::text[])[rn] as cc 
     from (select id, row_number() over (order by id) as rn from t) as base 
     where rn <= 5 
     ) as middle 
where middle.id = t.id; 

В самом внутреннем запросе (базового), номер строки извлекается для каждой записи в таблице. Затем в среднем запросе (middle) этот номер строки используется для получения соответствующего цветового кода из встроенного массива текстовых элементов. Наконец, инструкция обновления снова присоединяет этот результат к таблице t, ее id, чтобы сохранить этот цветовой код.

+0

@curiosa, это решило вашу проблему? Не могли бы вы дать некоторую обратную связь? – trincot

+0

Извините за поздний ответ, блестящий ответ @trincot это именно то, что я искал – curiosa

+0

Добро пожаловать. – trincot