2015-01-08 5 views
0

Я добавил новый столбец в одну из моих таблиц базы данных. Я хотел бы попытаться заполнить этот столбец для предыдущих записей. Новые записи будут проверяться через формы. Вот пример.SQL Set Cell Value В зависимости от смежного значения ячейки

| Quantity | Description   | Price | Amount | Type | 
---------------------------------------------------------- 
|  3 | Storage for Pallets | 3.99 | 11.97 | NULL | 
|  3 | Handling for Pallets| 3.99 | 11.97 | NULL | 
|  3 | Misc expense  | 3.99 | 11.97 | NULL | 
---------------------------------------------------------- 

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

| Quantity | Description   | Price | Amount | Type  | 
-------------------------------------------------------------- 
|  3 | Storage for Pallets | 3.99 | 11.97 | Storage | 
|  3 | Handling for Pallets| 3.99 | 11.97 | Handling | 
|  3 | Misc expense  | 3.99 | 11.97 | Misc  | 
-------------------------------------------------------------- 

Любые идеи относительно утверждения обновления, которое это выполнит?

+0

Я не против запуска дополнительных операторов для каждого ключевого слова, которое я выбираю , Хотите сохранить его просто – ctilley79

+0

Есть ли первичный ключ на столе? Это все столбцы или только некоторые? –

+0

Это приложение для рельсов, а ActiveRecord не устанавливает первичный ключ в таблице ... из коробки :) Это все столбцы – ctilley79

ответ

0

Поскольку первичного ключа нет, вы поместите значения в предложение where для всех значений столбцов. Или, по крайней мере, достаточно, чтобы не было шансов на обновление, набрав 2+ строки, основываясь на ваших знаниях данных.

Вот первое обновление в качестве примера:

update tbl 
    set "Type" = 'Storage' 
where "Quantity" = 3 
    and "Description" = 'Storage for Pallets' 
    and "Price" = 3.99 
    and "Amount" = 11.97; 

Fiddle: http://sqlfiddle.com/#!12/9fa64/1/0

Если бы первичный ключ, ваш ИНЕКЕ было бы намного проще:

where pk_id_field = x 

(Потому что вы можете быть уверены, зная, что собираетесь обновить нужную строку, и что никакие другие строки не имеют это значение)

0

Это было проще, чем я думал

UPDATE 
    invoice_line_items 
SET 
    line_item_type = "Storage" 
WHERE 
    description like "%storage%"; 

..... и так далее

+1

. Если вы хотите, чтобы обновление работало (по описанию, содержащему определенное слово) по всей таблице, тогда это будет хорошо –

0

На самом деле: Если вы хотите всегда описание в первое слово для типа, вы можете пойти с

UPDATE Invoice_Line_Items 
SET line_item_type = SUBSTRING_INDEX(description, ' ', 1); 

См SQL Fiddle. Разумеется, вы можете добавить предложение WHERE, если оно не так просто для всей таблицы ... И вы не ограничены первым словом либо ...

+0

Это было бы неплохо, но, к сожалению, вы ожидаете, что мои пользователи будут постоянными. – ctilley79

+0

Я думал/надеялся, описания будут под вашим контролем. Невезение. – Abecee