Страница 1 из 1

field calculator - if...

Добавлено: 24 авг 2011, 01:06
oleg
Есть 2 исходных текстовых поля (A, B) и пустое конечное (С). Данные "A" и "В" есть не для всех записей. В "C" нужно записать значение "A", если оно есть, и если нет - записать "В", если оно есть. Ничего нет - ничего не пишем в "C". Подскажите, пожалуйста, синтаксис (Arc/gv/Q). Спасибо.

UPD:Поправил опечатку.

Re: field calculator - if...

Добавлено: 24 авг 2011, 12:18
Slinger
Видимо:
записать "С", если оно есть.
Записать необходимо B, если нету А. А то вроде как C пустая...

Что-то на ум приходит только самое простое, а-ля:
В этом случае в обновляемую колонку запишется значения A и за ними значения B. Если A пустое, то запишется только B и наоборот. Если оба заполнены, то запишется и то и другое.

Хотя я всё-таки что-то не так понял =)

Re: field calculator - if...

Добавлено: 24 авг 2011, 20:09
oleg
Slinger писал(а):Видимо:
Записать необходимо B, если нету А. А то вроде как C пустая...
Да, поправил выше, спасибо.
Нужна запись в порядке приоритета, вариант со всеми значениями к сожалению не подходит...

Re: field calculator - if...

Добавлено: 24 авг 2011, 23:27
Александр Мурый
Не знаю точно, как в "Arc/gv/Q", но я создал подобную таблицу в GRASS (в DBF)

Код: Выделить всё

cat|A|B|C
1|a|b|
2|aa||
3|aaa|bb|
4|aaaa||
5||bbbb|
6|aaaaa|bbb|
7||bbbbbb|
8|||
9|||
Делаем два запроса:

Код: Выделить всё


echo "UPDATE vector SET C = A WHERE (A NOT NULL)" | db.execute
echo "UPDATE vector SET C = B WHERE (A IS NULL) AND (B NOT NULL)" | db.execute

Получается так:

Код: Выделить всё

cat|A|B|C
1|a|b|a
2|aa||aa
3|aaa|bb|aaa
4|aaaa||aaaa
5||bbbb|bbbb
6|aaaaa|bbb|aaaaa
7||bbbbbb|bbbbbb
8|||
9|||
В QGIS в "калькуляторе полей" не смог это повторить.

Re: field calculator - if...

Добавлено: 25 авг 2011, 11:51
Александр Мурый
Увлекся идеей заставить QGIS сделать вышеописанное. Создал такой же точечный слой в БД SpatiaLite, с помощью QspatiaLite не удалось (посыпались "ошибки SQL" + "error GeometryConstraints"). Поискал в сети -- говорят, какие-то траблы с версиями SpatiaLite и т.п.

Попробовал на "голом" SQLite:

Код: Выделить всё


UPDATE vector SET C = A WHERE (A IS NOT NULL);
UPDATE vector SET C = B WHERE (A IS NULL) AND (B IS NOT NULL);
-- работает :)

Интересно: так как проделать такое в QGIS (ну, кроме PostGIS)?

Re: field calculator - if...

Добавлено: 25 авг 2011, 12:07
yellow-sky
amuriy писал(а):Интересно: так как проделать такое в QGIS (ну, кроме PostGIS)?
Сделайте это в питоновской консоли. Пример

Re: field calculator - if...

Добавлено: 25 авг 2011, 12:16
Александр Мурый
yellow_sky писал(а):
amuriy писал(а):Интересно: так как проделать такое в QGIS (ну, кроме PostGIS)?
Сделайте это в питоновской консоли. Пример
Спасибо, попробую. Понять бы, как написать нужное выражение на питоне...