Kombinieren von Spalten QGIS-Attributtabelle

10

Ich habe zwei Spalten in meiner QGIS-Attributtabelle. Die erste Spalte enthält Werte, die nicht in der zweiten Spalte enthalten sind, und umgekehrt. Ich möchte ein neues Feld hinzufügen, das sowohl die Werte aus der ersten als auch aus der zweiten Spalte enthält. Ich dachte, es könnte so einfach sein wie "Wert 1 + Wert 2), aber das gibt mir nur Null- Ergebnisse. Alle Werte sind Zeichenfolgen.

Value 1| Value 2 | New Column
-------------------------
 Bacon |         | Bacon
 Eggs  |         | Eggs
       | Cheese  | Cheese
       | Ham     | Ham  
Dunuts
quelle
Der Wortlaut der Frage ist etwas mehrdeutig, wenn Sie verketten möchten: "Ich möchte ein neues Feld hinzufügen, das sowohl die Werte aus der ersten als auch aus der zweiten Spalte enthält." würde auf Verkettung hinweisen, aber in Ihrem Beispiel treten nicht beide Felder mit Werten auf. Welches ist es?
Gabriel C.
@ GabrielC. Beide Spalten haben keine Werte, wohingegen eine Spalte einen Wert hat, die andere Spalte nicht. Ich hoffe das hilft.
Dunuts

Antworten:

22

Viele Operatoren und Funktionen in SQL (und damit Ausdrücke) geben zurück, NULLwenn einer der Parameter warNULL

Die folgenden Beispiele zeigen das Verhalten verschiedener Operatoren auf einer Ebene mit den Spalten Aund 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'

In Ihrem Fall möchten Sie mit einem CONCAToder COALESCEabhängig vom erwarteten Verhalten mit mehreren / keinen Werten arbeiten.

Matthias Kuhn
quelle
1
Es ist schade, dass dies nicht die akzeptierte Antwort ist. Ich denke, dies ist die beste, da sie erklärt, wie sich die verschiedenen Operatoren verhalten und das im OP erwähnte Problem verursachen.
Gabriel C.
15

Sie können den Feldrechner verwenden und die folgenden Schritte ausführen:

1- Neues Feld erstellen (String)

2- Verwenden Sie die "Coalesce" -Funktion

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

Die Colaesce-Funktion gibt die erste nicht NULL zurück

Geben Sie hier die Bildbeschreibung ein

Carlos López Quintanilla
quelle
3

Wählen Sie die Ebene im Ebenenbedienfeld aus, öffnen Sie die Python-Konsole und führen Sie dieses Snippet aus:

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

Sie können auch den Feldrechner verwenden, ein neues Feld hinzufügen und ihm Folgendes geben

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