Объединение столбцов Таблица атрибутов QGIS

10

У меня есть две колонки в моей таблице атрибутов QGIS. Первый столбец содержит значения, которые не содержат второй столбец и наоборот. Я хотел бы добавить новое поле, которое содержит значения из первого и второго столбца. Я думал, что это может быть так же просто, как «Значение 1 + Значение 2), но это просто дает мне нулевые результаты. Все значения являются строками.

Value 1| Value 2 | New Column
-------------------------
 Bacon |         | Bacon
 Eggs  |         | Eggs
       | Cheese  | Cheese
       | Ham     | Ham  
Dunuts
источник
Это немного двусмысленно из формулировки вопроса, если вы хотите объединить: «Я хотел бы добавить новое поле, которое содержит как значения из первого и второго столбца». будет означать конкатенацию, но в вашем примере у вас нет вхождений обоих полей, имеющих значения. Что он?
Габриэль С.
@GabrielC. Оба столбца не имеют значений, где один столбец имеет значение, а другой - нет. Надеюсь, это поможет.
Данутс

Ответы:

22

Многие операторы и функции в SQL (и, следовательно, выражения) возвращают, NULLесли один из параметров былNULL

Следующие примеры демонстрируют поведение различных операторов на слое со столбцами Aи B.

"A" + "B"

  • NULL + 'text'NULL
  • 'a' + 'b''ab'

"A" || "B"

  • NULL || 'text'NULL
  • 'a' || 'b''ab'

CONCAT("A", "B")

  • CONCAT(NULL, 'text')'text'
  • CONCAT('a', 'b')'ab'

COALESCE("A", "B")

  • COALESCE(NULL, 'text')'text'
  • COALESCE('a', 'b')'a'
  • COALESCE('a', NULL)'a'
  • COALESCE(NULL, NULL, 'Other')'Other'

В вашем случае вы хотите работать с одним CONCATили в COALESCEзависимости от ожидаемого поведения с несколькими значениями или без них.

Матиас Кун
источник
1
Жаль, что это не принятый ответ, я думаю, что это лучший ответ, поскольку он объясняет, как ведут себя различные операторы, создавая проблему, упомянутую в ОП.
Габриэль С.
15

Вы можете использовать калькулятор поля и выполнить следующие действия:

1- Создать новое поле (строку)

2- Используйте функцию «Объединить»

       coalesce(  "Value 1" , "Value 2" , 'value if No data')

Функция Colaesce возвращает первое не NULL

введите описание изображения здесь

Карлос Лопес Кинтанилья
источник
3

Выберите слой на панели слоев, откройте консоль python и запустите этот фрагмент:

layer = iface.activeLayer()
layer.startEditing()
fields = layer.pendingFields()
fieldIndex = fields.indexFromName('newColumn')
for feature in layer.getFeatures():
    if feature['value1']:
        layer.changeAttributeValue(feature.id(),fieldIndex,feature['value1'])
    if feature['value2']:
        layer.changeAttributeValue(feature.id(),fieldIndex,feature['value2'])
    if feature['value1'] and feature['value2']:
        layer.changeAttributeValue(feature.id(),fieldIndex,feature['value2'] + ' ' + feature['value2']) # not sure what you want to do here if values found in both value1 and value2 fields
layer.commitChanges()
artwork21
источник
2

Вы также можете использовать калькулятор поля, добавить новое поле и скормить ему следующее

CASE WHEN "column1" IS NULL
THEN "column2"
ELSE "column1"
END
Erik
источник