Combinaison de colonnes Table d'attributs QGIS

10

J'ai deux colonnes dans ma table d'attributs QGIS. La première colonne contient des valeurs qui ne sont pas contenues dans la deuxième colonne et vice versa. Je voudrais ajouter un nouveau champ qui contient à la fois les valeurs de la première et de la deuxième colonne. J'ai pensé que cela pourrait être aussi simple que "Valeur 1 + Valeur 2) mais cela me donne juste des résultats Null . Toutes les valeurs sont des chaînes.

Value 1| Value 2 | New Column
-------------------------
 Bacon |         | Bacon
 Eggs  |         | Eggs
       | Cheese  | Cheese
       | Ham     | Ham  
Dunuts
la source
Il est légèrement ambigu du libellé de la question si vous souhaitez concaténer: "Je voudrais ajouter un nouveau champ qui contient à la fois les valeurs de la première et de la deuxième colonne." indiquerait la concaténation, mais dans votre exemple, vous n'avez aucune occurrence de deux champs ayant des valeurs. Lequel est-ce?
Gabriel C.
@GabrielC. Les deux colonnes n'ont pas de valeurs, chaque fois qu'une colonne a une valeur, l'autre colonne n'en aura pas. J'espère que ça aide.
Dunuts

Réponses:

22

De nombreux opérateurs et fonctions en SQL (et donc des expressions) retournent NULLsi l'un des paramètres étaitNULL

Les exemples suivants illustrent le comportement de divers opérateurs sur une couche avec les colonnes Aet 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'

Dans votre cas, vous souhaitez travailler avec CONCATou COALESCEselon le comportement attendu avec plusieurs / aucune valeur.

Matthias Kuhn
la source
1
C'est dommage que ce ne soit pas la réponse acceptée, je pense que c'est la meilleure car elle explique comment les différents opérateurs se comportent, créant le problème mentionné dans le PO.
Gabriel C.
15

Vous pouvez utiliser la calculatrice de champ et suivre ces étapes:

1- Créer un nouveau champ (chaîne)

2- Utiliser la fonction "Coalesce"

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

La fonction Colaesce renvoie la première non NULL

entrez la description de l'image ici

Carlos López Quintanilla
la source
3

Sélectionnez le calque dans le panneau des calques et ouvrez la console python et exécutez cet extrait:

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()
oeuvre21
la source
2

Vous pouvez également utiliser la calculatrice de champ, ajouter un nouveau champ et lui fournir les informations suivantes

CASE WHEN "column1" IS NULL
THEN "column2"
ELSE "column1"
END
Erik
la source