Combinazione di colonne Tabella degli attributi QGIS


10

Ho due colonne nella mia tabella degli attributi QGIS. La prima colonna contiene valori che non sono contenuti nella seconda colonna e viceversa. Vorrei aggiungere un nuovo campo che contenga entrambi i valori della prima e della seconda colonna. Ho pensato che potesse essere semplice come "Valore 1 + Valore 2) ma questo mi dà solo risultati Null . Tutti i valori sono stringhe.

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

È leggermente ambiguo dalla formulazione della domanda se si desidera concatenare: "Vorrei aggiungere un nuovo campo che contenga entrambi i valori della prima e della seconda colonna". indicherebbe concatenazione ma nel tuo esempio non hai occorrenze di entrambi i campi con valori. Cos'è questo?
Gabriel C.

@GabrielC. Entrambe le colonne non hanno valori, ovunque una colonna abbia un valore che l'altra colonna non avrà. Spero che questo possa essere d'aiuto.
Dunuts,

Risposte:


22

Molti operatori e funzioni in SQL (e quindi espressioni) restituiscono NULLse fosse uno dei parametriNULL

Gli esempi seguenti mostrano il comportamento di vari operatori su un livello con le colonne 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'

Nel tuo caso, vuoi lavorare con uno CONCATo in COALESCEbase al comportamento previsto con più / nessun valore.


1
Peccato che questa non sia la risposta accettata, penso che questa sia la migliore in quanto spiega come si comportano i diversi operatori, creando il problema menzionato nel PO.
Gabriel C.

15

È possibile utilizzare il calcolatore di campo e seguire questi passaggi:

1- Crea nuovo campo (stringa)

2- Utilizzare la funzione "Coalesce"

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

La funzione Colaesce restituisce il primo non NULL

inserisci qui la descrizione dell'immagine


3

Seleziona il livello nel pannello dei livelli e apri la console di Python ed esegui questo frammento:

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

Puoi anche usare il calcolatore di campo, aggiungere un nuovo campo e dargli da mangiare come segue

CASE WHEN "column1" IS NULL
THEN "column2"
ELSE "column1"
END
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.