Como concatenar rótulos no QGIS?

14

Estou usando o QGIS 1.8 na máquina Windows XP e tento fazer uma concatenação de vários campos para rotular os nomes das minhas estradas locais na tabela de atributos, mas não consigo encontrar a sintaxe correta. O primeiro campo consiste em om a rua, o segundo tipo de link, por exemplo: Avenida e a terceira orientação, por exemplo, Leste ou Oeste. Você poderia me dizer como escrever a sintaxe correta usando a caixa de diálogo de rótulos com base em uma fórmula. Anexou uma captura de tela que mostra a tabela de atributos.

insira a descrição da imagem aqui

Gabriel Giroux
fonte

Respostas:

19

O operador de concatenação é ||(ímpar, hein?), Então você usaria algo como:

street || ', ' || link || ', ' || orientation

Inverta-os com quaisquer separadores e cordas estáticas que desejar.

Como o @NathanW observou, isso falhará se algum dos campos for NULL, mas você pode usar um valor de fallback nesse caso:

street || ', ' || CASE WHEN ("link" IS NULL) THEN '(nodata)' ELSE "link" END || ', ' || orientation

O QGIS suporta uma função auxiliar coalescedesde a versão 2.0. Está lá para evitar os problemas dos NULLs e o exemplo seria:

 street || ', ' || coalesce(link, '(nodata)') || ', ' || orientation
lynxlynxlynx
fonte
2
Há também a concatfunção nas versões dev. Usando || não manipula NULL, se linkfor NULL, o rótulo inteiro é nulo concatnão possui esse problema. || é feita a partir de Postgres postgresql.org/docs/9.1/static/functions-string.html
Nathan W
Parece que ele não suporta instruções de caso diretamente. É a única opção sem usar o SQL diretamente para criar uma cópia não NULL da coluna do link?
Lynxlynxlynx
Como assim, não suporta declarações de caso?
Nathan W
3
Está faltando END. A string correta éCASE WHEN ("link" IS NULL) THEN '(nodata)' ELSE "link" END
Nathan W
1
ahh coalesceé o que eu quis dizer.
19712 Nathan W
2

No QGIS versão 2.0.1, a expressão simples funcionava assim:

"campo1" || '(' || "campo2" || ')'

saída desejada: campo1 (campo2)

Pavlarian
fonte