Łączenie kolumn Tabela atrybutów QGIS

10

Mam dwie kolumny w mojej tabeli atrybutów QGIS. Pierwsza kolumna zawiera wartości, które nie są zawarte w drugiej kolumnie i na odwrót. Chciałbym dodać nowe pole, które zawiera zarówno wartości z pierwszej, jak i drugiej kolumny. Pomyślałem, że może to być tak proste jak „Wartość 1 + Wartość 2), ale daje mi to po prostu wyniki Null . Wszystkie wartości są ciągami znaków.

Value 1| Value 2 | New Column
-------------------------
 Bacon |         | Bacon
 Eggs  |         | Eggs
       | Cheese  | Cheese
       | Ham     | Ham  
Dunuts
źródło
Jeśli chodzi o konkatenację: „Chciałbym dodać nowe pole, które zawiera zarówno wartości z pierwszej, jak i drugiej kolumny”. wskazuje na konkatenację, ale w twoim przykładzie nie ma przypadków, gdy oba pola mają wartości. Który to jest?
Gabriel C.
@GabrielC. Obie kolumny nie mają wartości, gdziekolwiek jedna kolumna ma wartość, a druga nie. Mam nadzieję, że to pomoże.
Dunuts,

Odpowiedzi:

22

Wiele operatorów i funkcji w SQL (a zatem i wyrażeniach) zwraca wartość, NULLjeśli był to jeden z parametrówNULL

Poniższe przykłady pokazują zachowanie różnych operatorów na warstwie z kolumnami Ai 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'

W twoim przypadku chcesz pracować z jednym CONCATlub w COALESCEzależności od oczekiwanego zachowania z wieloma wartościami / bez.

Matthias Kuhn
źródło
1
Szkoda, że ​​nie jest to akceptowana odpowiedź, myślę, że jest to najlepsza, ponieważ wyjaśnia, jak zachowują się różni operatorzy, tworząc problem wspomniany w PO.
Gabriel C.
15

Możesz użyć kalkulatora pola i wykonać następujące kroki:

1- Utwórz nowe pole (ciąg)

2 - Użyj funkcji „Coalesce”

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

Funkcja Colaesce zwraca pierwszą wartość inną niż NULL

wprowadź opis zdjęcia tutaj

Carlos López Quintanilla
źródło
3

Wybierz warstwę w panelu warstw, otwórz konsolę python i uruchom ten fragment:

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()
grafika 21
źródło
2

Możesz także użyć kalkulatora pola, dodać nowe pole i nakarmić go następującymi

CASE WHEN "column1" IS NULL
THEN "column2"
ELSE "column1"
END
Erik
źródło