Поєднання стовпців таблиці атрибутів QGIS


10

У моїй таблиці атрибутів QGIS є два стовпці. Перший стовпець містить значення, які не містять другий стовпчик, і навпаки. Я хотів би додати нове поле, яке містить обидва значення з першого та другого стовпців. Я думав, що це може бути так само просто, як "Значення 1 + Значення 2), але це просто дає мені нульові результати. Усі значення - це рядки.

Value 1| Value 2 | New Column
-------------------------
 Bacon |         | Bacon
 Eggs  |         | Eggs
       | Cheese  | Cheese
       | Ham     | Ham  

Дещо неоднозначне щодо формулювання питання, якщо ви хочете об'єднатись: "Я хотів би додати нове поле, яке містить обидва значення з першого та другого стовпців". вказує на конкатенацію, але у вашому прикладі ви не маєте обох полів, які мають значення. Що це таке?
Габріель К.

@GabrielC. Обидва стовпці не мають значень, де б один стовпець не мав значення, інший стовпець не буде. Я сподіваюся, що це допомагає.
Dunuts

Відповіді:


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"

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

Функція Colaesce повертає перший не NULL

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


3

Виберіть шар на панелі шарів і відкрийте консоль пітона та запустіть цей фрагмент:

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()

2

Ви також можете використовувати калькулятор поля, додати нове поле і подати йому наступне

CASE WHEN "column1" IS NULL
THEN "column2"
ELSE "column1"
END
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.