Tabla de atributos de QGIS de combinación de columnas

10

Tengo dos columnas en mi tabla de atributos QGIS. La primera columna contiene valores que no están contenidos en la segunda columna y viceversa. Me gustaría agregar un nuevo campo que contenga los valores de la primera y segunda columna. Pensé que podría ser tan simple como "Valor 1 + Valor 2), pero esto me da resultados nulos . Todos los valores son cadenas.

Value 1| Value 2 | New Column
-------------------------
 Bacon |         | Bacon
 Eggs  |         | Eggs
       | Cheese  | Cheese
       | Ham     | Ham  
Dunuts
fuente
Es un poco ambiguo de la redacción de la pregunta si desea concatenar: "Me gustaría agregar un nuevo campo que contenga los valores de la primera y segunda columna". indicaría concatenación pero en su ejemplo no tiene ocurrencias de que ambos campos tengan valores. Cual es
Gabriel C.
@GabrielC. Ambas columnas no tienen valores, donde una columna tiene un valor, la otra columna no. Espero que esto ayude.
Dunuts

Respuestas:

22

Muchos operadores y funciones en SQL (y, por lo tanto, expresiones) regresan NULLsi uno de los parámetros eraNULL

Los siguientes ejemplos demuestran el comportamiento de varios operadores en una capa con las columnas Ay 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'

En su caso, desea trabajar con cualquiera CONCATo COALESCEdependiendo del comportamiento esperado con múltiples / sin valores.

Matthias Kuhn
fuente
1
Es una pena que esta no sea la respuesta aceptada, creo que esta es la mejor, ya que explica cómo se comportan los diferentes operadores, creando el problema mencionado en el OP.
Gabriel C.
15

Puede usar la calculadora de campo y seguir estos pasos:

1- Crear nuevo campo (cadena)

2- Utilice la función "Fusionar"

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

La función Colaesce devuelve el primer no NULL

ingrese la descripción de la imagen aquí

Carlos López Quintanilla
fuente
3

Seleccione la capa en el panel de capas y abra la consola de Python y ejecute este fragmento:

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

También puede usar la calculadora de campo, agregar un nuevo campo y alimentarlo con lo siguiente

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