2010-05-15 6 views
3

У меня есть база данных, полная простых данных заметки, со столбцами для названия, сроков, приоритетов и деталей. Существует также столбец _id PRIMARY KEY int.Как слить существующую строку с новыми данными в SQLite?

Скажите, что у меня есть записка в таблице уже с некоторыми заполненными данными, а остальное равно null. У меня также есть набор данных, которые заполнят все эти поля.

Есть ли способ, чтобы я мог писать данные только в поля, которые являются NULL?

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

Я знаю rowId целевой строки.

Если моя целевая строка была RowId 5, я мог бы сделать что-то вроде этого:

UPDATE SET duedate='some date', priority='2', details='some text' WHERE _id=5 

Но что бы переписать все данные в этой строке, и я не хочу потерять все данные, которые могли бы будь там. Как я могу изменить это утверждение, чтобы избежать записи ненулевых полей?

ответ

5

Предположим, вы начинаете с

CREATE TABLE "t" ("a" , "b" , "c"); 
INSERT INTO "t" ("a", "c") VALUES (1, 3); 

Тогда

update t set a = coalesce(a,9), b = coalesce(b,10), c = coalesce(c,11); 

будет обновлять только нулевые значения, то есть. только столбец B будет установлен в 10. A и C будут оставлены в покое, потому что они содержат значения.

Coalesce означает выбор первого элемента в списке, который не является нулевым.

+0

+1: Идеальная функция для такого рода вещей. –

+0

Мне это нравится. Он прост и легко расширяется, что позволяет использовать больше полей. – CodeFusionMobile

2

Оператор UPDATE изменяет только поля, указанные в предложении SET. Если есть поля, значение которых вы хотите оставить без изменений, просто не указывайте эти поля в предложении SET.

Другими словами, UPDATE не записывает во все поля таблицы - только поля, которые вы указываете для строк, которые вы выбираете с предложением WHERE.

Если вы просто не знаете, являются ли существующие данные NULL или нет, вы можете установить значения с помощью IFNULL(CurrentValue, NewValueIfNull). Например.

UPDATE SET due_date=IFNULL(due_date, "some date") ... etc.. 

Это позволит объединить несколько новых значения в строку, где там нулевые значения и оставить непустые значения, как они были.

См SQL Lite, IFNULL

0

Как насчет: UPDATE SET DueDate = 'некоторые даты' WHERE _id = 5 и DueDate равна нулю; UPDATE SET priority = '2' WHERE _id = 5, а приоритет - null; Подробности UPDATE SET = 'некоторый текст' WHERE _id = 5, а приоритет - null;

Если вы используете Mysql, вы можете искать IF() - тогда вы можете создать один вкладыш. Я думаю, что вы можете сделать что-то с подобными в Oracle с футляром ...

+0

SQLite3 в android не поддерживает несколько операторов. Я должен буду делать каждый отдельно. Не рекомендуется – CodeFusionMobile

Смежные вопросы