Как объединить существующую строку с новыми данными в SQLite? - PullRequest
3 голосов
/ 16 мая 2010

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

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

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

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

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 16 мая 2010

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

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 останутся одни, поскольку они содержат значения.

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

2 голосов
/ 16 мая 2010

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

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

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

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

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

См. SQL Lite, IFNULL

0 голосов
/ 16 мая 2010

Как насчет: ОБНОВЛЕНИЕ УСТАНОВЛЕНО duedate = 'some date' ГДЕ _id = 5 и duedate имеет значение null; ОБНОВЛЕНИЕ УСТАНОВИТ приоритет = '2' ГДЕ _id = 5 и приоритет равен нулю; UPDATE SET details = 'некоторый текст' WHERE _id = 5 и приоритет равен нулю;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...