Opción Paréntesis en nueva línea
Paréntesis en nueva línea controla dónde va un paréntesis de apertura cuando inicia un bloque con sangría: al final de la línea que lo introduce (el valor predeterminado) o en una línea propia. Esta página muestra exactamente qué paréntesis se mueven, con salida real para las dos configuraciones.
Qué hace la opción
Cuando el formateador abre un bloque entre paréntesis, como una subconsulta después de IN, aplica
un nivel de sangría al contenido y pone el paréntesis de cierre en su propia línea. Lo único que queda por
decidir es dónde va el paréntesis de apertura:
- Desactivada (predeterminado): se queda al final de la línea que lo introduce, como en
WHERE id IN (. - Activada: la línea que lo introduce termina con la palabra clave
(
WHERE id IN), y el paréntesis va en su propia línea, con la misma sangría que la línea a la que pertenece.
El contenido y el paréntesis de cierre se disponen igual en los dos modos. Solo se mueve un carácter.
Valores posibles y valor predeterminado
| Valor | Resultado |
|---|---|
| Desactivada (predeterminado) | IN (, AS (, FROM ( en una sola línea |
| Activada | El paréntesis de apertura queda solo en la línea siguiente, alineado con su paréntesis de cierre |
Subconsulta después de IN
Es el caso más común. Compara la línea que sigue a WHERE id IN en las dos salidas:
select name, email from customers where id in (select customer_id from orders where total > 500 and status = 'PAID')SELECT name,
email
FROM customers
WHERE id IN (
SELECT customer_id
FROM orders
WHERE total > 500
AND status = 'PAID'
)SELECT name,
email
FROM customers
WHERE id IN
(
SELECT customer_id
FROM orders
WHERE total > 500
AND status = 'PAID'
)Con la opción activada, los paréntesis de apertura y de cierre quedan en la misma columna, uno encima del otro, con la subconsulta entre ellos.
CTE y tablas derivadas
El cuerpo de una expresión de tabla común (CTE) y una tabla derivada en FROM se comportan igual. La
línea WITH recent AS y la línea FROM pierden su paréntesis, que pasa a la línea
siguiente:
with recent as (select customer_id, sum(total) as total from orders where created_at >= current_date - 90 group by customer_id) select x.region, sum(x.total) as region_total from (select t.region, r.total from recent r join territories t on t.customer_id = r.customer_id) x group by x.regionWITH recent AS (
SELECT customer_id,
SUM(total) AS total
FROM orders
WHERE created_at >= CURRENT_DATE - 90
GROUP BY customer_id
)
SELECT x.region,
SUM(x.total) AS region_total
FROM (
SELECT t.region,
r.total
FROM recent r
JOIN territories t
ON t.customer_id = r.customer_id
) x
GROUP BY x.regionWITH recent AS
(
SELECT customer_id,
SUM(total) AS total
FROM orders
WHERE created_at >= CURRENT_DATE - 90
GROUP BY customer_id
)
SELECT x.region,
SUM(x.total) AS region_total
FROM
(
SELECT t.region,
r.total
FROM recent r
JOIN territories t
ON t.customer_id = r.customer_id
) x
GROUP BY x.regionLo mismo ocurre con la lista de columnas y la lista de VALUES de un INSERT y con las
definiciones de columnas de un CREATE TABLE, que el formateador también dispone como bloques con
sangría. Una lista de una sola columna, como INSERT INTO t (id), se queda en línea y no se
mueve.
Llamadas a funciones y listas de valores
La opción se fija en la disposición, no en el tipo de paréntesis. Todo paréntesis que abre un bloque con sangría
se mueve, y todo paréntesis que se queda en línea no. La única excepción es la especificación de ventana:
OVER ( siempre se queda en la línea de su función, en los dos modos.
select id, count(*) as items, coalesce(discount_code, 'NONE') as discount, (select max(shipped_at) from shipments s where s.order_id = o.id) as last_shipment from orders o where status in ('PAID', 'SHIPPED') group by id, discount_codeSELECT id,
COUNT(*) AS items,
COALESCE(
discount_code,
'NONE'
) AS discount,
(
SELECT
MAX(shipped_at)
FROM shipments s
WHERE s.order_id = o.id
) AS last_shipment
FROM orders o
WHERE status IN (
'PAID',
'SHIPPED'
)
GROUP BY id,
discount_codeSELECT id,
COUNT(*) AS items,
COALESCE
(
discount_code,
'NONE'
) AS discount,
(
SELECT
MAX(shipped_at)
FROM shipments s
WHERE s.order_id = o.id
) AS last_shipment
FROM orders o
WHERE status IN
(
'PAID',
'SHIPPED'
)
GROUP BY id,
discount_codeEn este ejemplo:
COUNT(*)yMAX(shipped_at)se quedan en una sola línea, así que sus paréntesis no se tocan.COALESCEse divide en un argumento por línea, así que, con la opción activada, su paréntesis pasa a la línea siguiente, con la misma sangría que el nombre de la función.- La lista de valores
IN ('PAID', 'SHIPPED')también se divide en un valor por línea, y su paréntesis se mueve exactamente igual que el de una subconsulta. - La subconsulta escalar de la lista del select ya empieza con su paréntesis en una línea propia, así que las dos salidas son idénticas en ese punto.
Cuándo activarla
Las dos configuraciones son el equivalente en SQL del debate sobre dónde poner las llaves en los lenguajes derivados de C.
Déjala desactivada para una salida compacta que se parezca a la mayor parte del SQL de la
documentación y de las guías de estilo publicadas, donde WITH name AS ( e IN ( son la
forma habitual de escribirlo. Cada bloque ocupa una línea menos, y la palabra clave que abre el bloque queda
visualmente pegada a él. El paréntesis de cierre se alinea con el inicio de la línea que abrió el bloque, lo que
alcanza para encontrar el par en la mayoría de las consultas.
Actívala cuando trabajes con consultas largas y muy anidadas y quieras emparejar los paréntesis
a simple vista. Como los paréntesis de apertura y de cierre comparten columna, las guías de sangría del editor o
un rápido recorrido vertical muestran dónde empieza y termina cada bloque. Algunos equipos también consideran
que una palabra clave sola al final de una línea (IN, AS, FROM) indica
claramente que a continuación viene un bloque.
Los costos son una línea extra por bloque, que se acumula en consultas con muchas CTE, y llamadas a funciones que
se leen de forma un poco inusual, con COALESCE en una línea y su paréntesis en la siguiente. Si la
mayoría de tus bloques largos son CTE y subconsultas, el intercambio puede valer la pena; si la mayoría son
llamadas a funciones divididas, el valor predeterminado suele leerse mejor.
Opciones relacionadas
La sangría dentro de cada bloque proviene de Espacios de sangría y no cambia con esta opción. Mover el paréntesis no alarga ninguna línea, así que nunca provoca cortes adicionales por Cantidad máxima de columnas. Comas y Palabras clave se aplican al contenido del bloque como siempre. Para consejos más amplios sobre cómo estructurar consultas anidadas, CTE y subconsultas antes de formatearlas, consulta formateo de consultas complejas, y prueba las dos configuraciones con tu propio SQL en el formateador: se cambia con un solo clic.