Opción Espacios de sangría

Espacios de sangría define cuántos espacios agrega el formateador por cada nivel de anidamiento. Esta página muestra qué cambia entre 2, 4 y 0, qué pasa con los caracteres de tabulación de tu entrada y cómo elegir un valor que tu equipo no tenga que volver a discutir.

Qué hace la opción

El formateador reconstruye desde cero la disposición de cada sentencia, así que la sangría que escribiste no se conserva. Lo que controlas es el ancho de un paso de sangría. Ese paso se aplica en todos los lugares donde la disposición anida algo:

  • los elementos del select a partir del segundo, y los elementos de continuación de GROUP BY, ORDER BY, SET y RETURNING;
  • los joins debajo de FROM, con la condición ON un paso más adentro;
  • el cuerpo de una subconsulta o CTE dentro de sus paréntesis, y la especificación de ventana después de OVER (;
  • los argumentos de una función cuando la llamada se divide en varias líneas.

Las palabras clave de cláusula, como SELECT, FROM y WHERE, empiezan en la sangría del bloque al que pertenecen, y las líneas AND/OR se alinean con su WHERE. Eso no cambia con esta opción; solo cambia el tamaño de cada paso.

Valores posibles y valor predeterminado

ValorResultado
4 (predeterminado)Cada nivel de anidamiento agrega cuatro espacios.
2Una disposición más compacta; el anidamiento profundo ocupa la mitad del ancho.
0Sin ninguna sangría; todas las líneas empiezan en la columna 0.
Cualquier otro número hasta 99El formulario lo acepta, pero rara vez es útil por encima de 8.

La misma consulta con el valor predeterminado de 4 y con 2. Solo cambian los espacios al inicio de cada línea; los saltos de línea son idénticos.

Antes
select c.name, sum(o.total) as revenue from customers c join orders o on o.customer_id = c.id where o.status = 'PAID' and c.id in (select customer_id from loyalty_members where tier = 'GOLD') group by c.name order by revenue desc
Después, formateado por SQL Format
Opciones: Espacios de sangría 4 · Cantidad máxima de columnas 120 · Comas: Después · Palabras clave: Mayúsculas · Paréntesis en nueva línea: no
SELECT c.name,
    SUM(o.total) AS revenue
FROM customers c
    JOIN orders o
        ON  o.customer_id = c.id
WHERE o.status = 'PAID'
AND c.id IN (
    SELECT customer_id
    FROM loyalty_members
    WHERE tier = 'GOLD'
)
GROUP BY c.name
ORDER BY revenue DESC
Después, formateado por SQL Format
Opciones: Espacios de sangría 2 · Cantidad máxima de columnas 120 · Comas: Después · Palabras clave: Mayúsculas · Paréntesis en nueva línea: no
SELECT c.name,
  SUM(o.total) AS revenue
FROM customers c
  JOIN orders o
    ON  o.customer_id = c.id
WHERE o.status = 'PAID'
AND c.id IN (
  SELECT customer_id
  FROM loyalty_members
  WHERE tier = 'GOLD'
)
GROUP BY c.name
ORDER BY revenue DESC

Dos espacios o cuatro

Ambos son comunes, y la mayoría de las guías de estilo de SQL publicadas elige uno de los dos y usa espacios en lugar de tabulaciones. Las diferencias prácticas son pequeñas, pero reales:

  • Cuatro espacios hacen que cada nivel se vea de inmediato. En el ejemplo anterior, la línea ON queda ocho columnas adentro, claramente subordinada a su join, y el cuerpo de la subconsulta se distingue del WHERE externo. Quienes vienen de Java, C# o Python ya están acostumbrados a leer código con este ancho.
  • Dos espacios mantienen legibles las consultas muy anidadas en pantallas angostas y en diffs lado a lado. Una subconsulta tres niveles más adentro empieza en la columna 6 en lugar de la 12, lo que deja más espacio antes de que el límite de cantidad máxima de columnas parta una expresión larga. Los equipos que incrustan SQL en YAML, modelos de dbt o cadenas de la aplicación suelen preferirlo, porque el archivo que lo contiene ya tiene su propia sangría.

La elección importa mucho menos que mantenerla. Cambiar el ancho de sangría de un archivo existente reescribe los espacios iniciales de casi todas sus líneas, lo que entierra los cambios reales en una revisión de código. Si necesitas cambiarlo, hazlo en un commit que no contenga nada más, como se describe en formateo para revisión de código y control de versiones.

Qué pasa con los caracteres de tabulación

Cada carácter de tabulación de la entrada, fuera de los literales de cadena y de los identificadores entre comillas, se reemplaza por la cantidad de espacios configurada antes de armar la disposición de la consulta. En el SQL en sí esto no se nota, porque la disposición se reconstruye de todos modos. Donde sí lo notas es dentro de los comentarios de varias líneas: una línea de comentario con una tabulación de sangría termina con exactamente un paso de sangría, así que el comentario conserva su forma y queda alineado con el código que lo rodea.

Antes
/*
	Customers created in the last 30 days
		owner: data team
*/
select id,
	email,
	created_at
from customers
where	created_at >= current_date - 30
Después, formateado por SQL Format
Opciones: Espacios de sangría 4 · Cantidad máxima de columnas 120 · Comas: Después · Palabras clave: Mayúsculas · Paréntesis en nueva línea: no
/*
    Customers created in the last 30 days
        owner: data team
*/
SELECT id,
    email,
    created_at
FROM customers
WHERE created_at >= CURRENT_DATE - 30
Después, formateado por SQL Format
Opciones: Espacios de sangría 2 · Cantidad máxima de columnas 120 · Comas: Después · Palabras clave: Mayúsculas · Paréntesis en nueva línea: no
/*
  Customers created in the last 30 days
    owner: data team
*/
SELECT id,
  email,
  created_at
FROM customers
WHERE created_at >= CURRENT_DATE - 30

Las tabulaciones dentro de literales de cadena y de identificadores entre comillas son datos, así que se conservan exactamente como se escribieron. Las tabulaciones dentro de comentarios no son datos y se reemplazan como cualquier otra. Si un valor debe contener una tabulación, igual vale la pena considerar una función de caracteres como CHR(9) en PostgreSQL y Oracle o CHAR(9) en SQL Server y MySQL: en una revisión de código se ve mucho mejor que una tabulación invisible.

Sangría 0

Con 0, el formateador sigue poniendo cada cláusula, elemento del select, join y condición en su propia línea, y sigue aplicando Palabras clave y Comas. Simplemente deja de aplicar sangría:

Después, formateado por SQL Format
Opciones: Espacios de sangría 0 · Cantidad máxima de columnas 120 · Comas: Después · Palabras clave: Mayúsculas · Paréntesis en nueva línea: no
SELECT c.name,
SUM(o.total) AS revenue
FROM customers c
JOIN orders o
ON  o.customer_id = c.id
WHERE o.status = 'PAID'
AND c.id IN (
SELECT customer_id
FROM loyalty_members
WHERE tier = 'GOLD'
)
GROUP BY c.name
ORDER BY revenue DESC

El resultado es fácil de procesar línea por línea, pero la estructura desaparece: lo único que indica dónde empieza y termina la subconsulta es su par de paréntesis. Usa 0 cuando otra herramienta vuelva a aplicar sangría a la salida después, o cuando solo quieras un elemento por línea para una comparación rápida de texto. Para SQL que van a leer personas, 2 o 4 es la mejor opción.

Cómo interactúa con otras opciones

  • Cantidad máxima de columnas. La sangría cuenta para el ancho de la línea. Con una sangría mayor, las líneas anidadas llegan antes al límite y se parten antes. Las líneas de continuación siempre reciben 2 espacios adicionales, sin importar la sangría que elijas.
  • Comas. Con comas al inicio, cada coma queda en la columna de sangría, con el elemento justo después, así que el ancho de sangría decide a qué distancia del margen izquierdo queda la columna de comas.
  • Paréntesis en nueva línea. Cuando el paréntesis de apertura va en su propia línea, el bloque interior sigue llevando un paso de sangría.

Cómo elegir un valor

Mantén el valor predeterminado de 4 a menos que tengas un motivo para cambiarlo: es el más fácil de leer y no necesita explicación en una guía de estilo. Elige 2 si tus consultas tienen mucho anidamiento, si el SQL vive dentro de archivos que ya tienen sangría o si tu equipo revisa diffs lado a lado en laptops. Elijas lo que elijas, anótalo junto a las demás reglas de tu guía de estilo de SQL y usa el mismo valor cada vez que ejecutes el formateador, para que el formato nunca aparezca como un cambio por sí solo.