Considere esta declaración de selección:
SELECT *,
1 AS query_id
FROM players
WHERE username='foobar';
Devuelve la columna query_id
con valor 1
junto con las otras columnas de un jugador.
¿Cómo podría uno hacer que el SQL anterior devuelva al menos el query_id
de 1
incluso si la selección no encuentra filas que coincidan?
Por cierto, es PostgreSQL 8.4.
postgresql
select
null
Nathanael Weiss
fuente
fuente
order by
. La segunda "crea" una tabla virtual con exactamente una fila y una columna y realiza una unión externa (sin ninguna condición de unión "real"), por lo que siempre obtiene al menos esa fila. Usarselect *
en el código de producción es un mal estilo. No lo hagas Enumere siempre las columnas que necesita.select *
debe solamente ser utilizados en las consultas ad-hoc.left join
no es legible?UNION ALL
veces puede ser más eficiente queUNION
, ya que explícitamente le está diciendo al planificador de consultas que espera que no haya filas duplicadas que salgan de lasUNION
consultas ed o si hay que quieres que salgan. Sin elALL
modificador, supone que desea eliminar las filas duplicadas (solo una de cada una devuelta) de forma muy similar a laDISTINCT
palabra clave, y para garantizar que pueda necesitar recurrir + volver a escanear los resultados un tiempo extra. Por lo tanto, useALL
con aUNION
menos que necesite específicamente la desduplicación de la fila de salida.Si solo espera una o cero filas hacia atrás, esto también funcionaría:
Esto devolverá una fila con todos los valores nulos, excepto query_id si no se encuentra ninguna fila.
fuente
username = 'foobar'
Entrando tarde aquí, pero aquí hay una sintaxis que funciona (al menos en 9.2, no he probado versiones anteriores).
Solo devolverá la fila "en blanco" si todo el contenido de "a" es nulo.
Disfrutar. / cabeza de bit
fuente
fuente