Preámbulo: esta solución fue escrita antes del momento en que el autor demostró sus esfuerzos en la calculadora de campo.
En QGIS puedo sugerir el uso de un "Capa virtual" a través de Layer > Add Layer > Add/Edit Virtual Layer...
.
Supongamos que tenemos una capa 'units_1'
(amarillo) con sus correspondientes tablas de atributos en consecuencia, véase la imagen siguiente.
Caso 1. Con agregación
Con la siguiente consulta, es posible estimar la longitud de la frontera común que comparten dos distritos/polígonos cualesquiera.
SELECT
u11.*,
GROUP_CONCAT(u12.id || ', len:' || round(st_length(st_intersection(u11.geometry, u12.geometry)), 4), "; ") AS "neighbor_info"
FROM
"unit_1" AS u11, "unit_1" AS u12
WHERE
st_intersects(u11.geometry, u12.geometry)
AND u11.id <> u12.id
GROUP BY
u11.id
ORDER BY
u11.id ASC
La capa virtual de salida con su tabla de atributos tendrá el siguiente aspecto
Caso 2. Sin agregación
En caso de que no haya que realizar ninguna agregación, se procederá a la siguiente consulta
SELECT
u11.*,
u12.id || ', len:' || round(st_length(st_intersection(u11.geometry, u12.geometry)), 4) AS "neighbor_info"
FROM
"unit_1" AS u11, "unit_1" AS u12
WHERE
st_intersects(u11.geometry, u12.geometry)
AND u11.id <> u12.id
ORDER BY
u11.id ASC
Entonces la nueva capa virtual de salida con su tabla de atributos tendrá el siguiente aspecto