4 votos

¿Cómo manejar valores NULL en el etiquetado?

En QGIS (2.10.1 en Mac), estoy tratando de hacer algunas etiquetas de varias líneas en un mapa que tengo con un montón de árboles. En la tabla de atributos tengo columnas con el nombre científico en latín, el nombre en inglés (cuando existe), el año en que se plantó el árbol, etc.

Estoy etiquetando los árboles en mi mapa con una expresión como esta:

genus_species + '\n' +
case
    when  "english_species" is not null then  "english_species" + '\n'
end
+ to_string( "planted_year")

Esto funciona bien para las filas donde english_species no es nulo, sin embargo, siempre que tengo una fila sin nombre en inglés, la expresión entera parece romperse y no se imprime nada, ni siquiera el nombre científico o el año (que siempre existe).

He intentado agregar un

when  "english_species" is null then ''

Pero eso tampoco funciona. La expresión simplemente falla para las filas sin valor en el campo english_species.

1 votos

¿Has intentado agregar una declaración else antes de end (por ejemplo else ' ')?

0 votos

Sí, ni cuando "english_species" es nulo entonces '' ni sino '' funcionan. Gracias, sin embargo.

15voto

Jauder Ho Puntos 3172

Entonces, la forma en que QGIS maneja NULL cuando se unen cadenas es que convertirá el resultado a NULL si alguna parte es NULL (sí, sé que hay un debate en curso sobre si debería hacerlo o no)

Así es como se maneja eso usando la función concat:

concat( "genus_species", '\n', "english_species", '\n', to_string("planted_year")

La función concat convertirá NULL a una cadena vacía y se unirá de todos modos.

0 votos

Esto sigue siendo cierto para QGIS 3.22.3.

1voto

s1d Puntos 91

Deberías usar la concatenación de cadenas en lugar de sumar (símbolo ||). Debería verse más o menos así:

 CASE
    WHEN "english_species" IS NULL THEN "genus_species" || '\n' || to_string("planted_year")
    ELSE  "genus_species" || '\n' || "english_species" || '\n' || to_string("planted_year")
 END

Actualización, en 2.10 ya no es necesario usar || para cadenas, por lo que todo se trata de la necesidad de usar ELSE, de lo contrario la expresión no es válida porque terminas con + + si no es el caso. Así que otra opción posible:

 "genus_species" + '\n' +
 CASE
    WHEN "english_species" IS NOT NULL THEN "english_species" + '\n'
    ELSE '' 
 END
 + to_string("planted_year")

Lo cual en otro caso resulta en + '' + y aunque es válido.

1 votos

Eh, ahora veo en 2.10 que la expresión funciona incluso con el signo de suma. Como Joseph mencionó, parece ser clave usar ELSE. Por alguna razón, como dices, si no hay un ELSE no devuelve ninguna cadena en absoluto.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X