Tabela de atributos do QGIS de colunas de combinação

10

Eu tenho duas colunas na minha tabela de atributos QGIS. A primeira coluna contém valores que não estão contidos na segunda coluna e vice-versa. Eu gostaria de adicionar um novo campo que contenha os valores da primeira e da segunda coluna. Eu pensei que poderia ser tão simples como "Valor 1 + Valor 2), mas isso só me dá resultados nulos . Todos os valores são seqüências de caracteres.

Value 1| Value 2 | New Column
-------------------------
 Bacon |         | Bacon
 Eggs  |         | Eggs
       | Cheese  | Cheese
       | Ham     | Ham  
Dunuts
fonte
É um pouco ambíguo da redação da pergunta se você deseja concatenar: "Gostaria de adicionar um novo campo que contenha os valores da primeira e da segunda coluna". indicaria concatenação, mas no seu exemplo você não tem ocorrências dos dois campos com valores. Qual é?
Gabriel C.
@GabrielC. Ambas as colunas não têm valores, sempre que uma coluna tem um valor, a outra coluna não. Eu espero que isso ajude.
Dunuts

Respostas:

22

Muitos operadores e funções no SQL (e, portanto, expressões) retornam NULLse um dos parâmetros foiNULL

Os exemplos a seguir demonstram o comportamento de vários operadores em uma camada com as colunas Ae 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'

No seu caso, você deseja trabalhar com CONCATou COALESCEdependendo do comportamento esperado com vários / nenhum valor.

Matthias Kuhn
fonte
11
É uma pena que esta não seja a resposta aceita, acho que é a melhor, pois explica como os diferentes operadores se comportam, criando o problema mencionado no OP.
Gabriel C.
15

Você pode usar a calculadora de campo e siga estas etapas:

1- Crie um novo campo (string)

2- Use a função "coalescer"

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

A função Colaesce retorna o primeiro não NULL

insira a descrição da imagem aqui

Carlos López Quintanilla
fonte
3

Selecione a camada no painel de camadas, abra o console python e execute este trecho:

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
fonte
2

Você também pode usar a calculadora de campo, adicionar um novo campo e alimentá-lo da seguinte maneira

CASE WHEN "column1" IS NULL
THEN "column2"
ELSE "column1"
END
Erik
fonte