¿Hay alguna forma de SELECT
todas las columnas de una tabla, excepto las específicas? Sería muy conveniente seleccionar todas las columnas no geométricas o no geométricas de una tabla.
Algo como:
SELECT * -the_geom FROM segments;
- Una vez escuché que esta funcionalidad se excluyó deliberadamente del estándar SQL porque cambiar agregar columnas a la tabla alterará los resultados de la consulta. ¿Es esto cierto? ¿Es válido el argumento?
- ¿Hay alguna solución, especialmente en PostgreSQL?
postgresql
sql-standard
Adam Matan
fuente
fuente
name
,age
,sid
) que encaja muy bien en la anchura de la pantalla, alongwith un binario largogeom
de la columna. Quiero consultar todos los campos excepto el binario de geometría, y escribir sus nombres uno por uno es tedioso.select (!coluns2,!column5) from sometable;
Respuestas:
Tal característica no existe en Postgres ni en el Estándar SQL (AFAIK). Creo que esta es una pregunta bastante interesante, así que busqué en Google un poco y encontré un artículo interesante en postgresonline.com .
Muestran un enfoque que selecciona las columnas directamente del esquema:
Podría crear una función que haga algo así. Dichos temas también se discutieron en las listas de correo, pero el consenso general fue más o menos el mismo: consultar el esquema.
Estoy seguro de que hay otras soluciones, pero creo que todas involucrarán algún tipo de esquema mágico-queriying-foo.
Por cierto: tenga cuidado
SELECT * ...
ya que esto puede tener sanciones de rendimientofuente
La verdadera respuesta es que simplemente no puedes prácticamente. Esta ha sido una característica solicitada durante décadas y los desarrolladores se niegan a implementarla.
La respuesta popular que sugiere consultar las tablas de esquema no podrá ejecutarse de manera eficiente porque el optimizador de Postgres considera las funciones dinámicas como un cuadro negro (consulte el caso de prueba a continuación). Eso significa que los índices no se utilizarán y las uniones no se realizarán de manera inteligente. Sería mucho mejor con algún tipo de sistema macro como m4. Al menos no confundirá al optimizador (pero aún así puede confundirlo a usted). Sin bifurcar el código y escribir la función usted mismo o usar una interfaz de lenguaje de programación, está atascado.
Escribí una prueba de concepto simple a continuación que muestra cuán malo sería el rendimiento con una ejecución dinámica muy simple en plpgsql. Observe también que a continuación tengo que forzar una función que devuelve un registro genérico a un tipo de fila específico y enumerar las columnas. Por lo tanto, este método no funcionará para 'seleccionar todo pero' a menos que desee rehacer esta función para todas sus tablas.
Como puede ver, la llamada a la función escaneó toda la tabla mientras la consulta directa usaba el índice ( 95.46 ms vs. 00.07ms .) Este tipo de funciones acumularían cualquier tipo de consulta complicada que necesitara usar índices o unir tablas en el orden correcto .
fuente
En realidad, es algo posible con PostgreSQL comenzando con 9.4 donde se introdujo JSONB. Estaba reflexionando sobre una pregunta similar sobre cómo mostrar todos los atributos disponibles en Google Map (a través de GeoJSON).
johto en el canal irc sugirió intentar eliminar el elemento de JSONB.
Aqui esta la idea
Si bien obtienes json en lugar de columnas individuales, era exactamente lo que quería. Quizás json pueda expandirse nuevamente en columnas individuales.
fuente
La única forma en que puede (no diga que debe hacerlo) es mediante el uso de sentencias sql dinámicas. Es fácil (como escribió DrColossos) consultar las vistas del sistema y encontrar la estructura de la tabla y construir declaraciones adecuadas.
PD: ¿Por qué querrías seleccionar todas / algunas columnas sin saber / escribir exactamente la estructura de tu tabla?
fuente
Dinámicamente, como se indicó anteriormente, es la única respuesta, pero no la recomendaré. ¿Qué sucede si agrega más columnas a largo plazo pero no son necesariamente necesarias para esa consulta?
Comenzaría a tirar de más columna de la que necesita.
¿Qué pasa si la selección es parte de una inserción como en
Insertar en la tabla A (col1, col2, col3 .. coln) Seleccione todo menos 2 columnas DE la tablaB
La coincidencia de columna será incorrecta y su inserción fallará.
Es posible, pero aún así recomiendo escribir todas las columnas necesarias para cada selección escrita, incluso si se requiere casi cada columna.
fuente
SELECT
s.Si su objetivo es eliminar el desorden de la pantalla durante la depuración al no mostrar columnas con valores de datos grandes, puede usar el siguiente truco:
(instale el paquete de contribución "hstore" si aún no lo tiene: "
CREATE EXTENSION hstore;
")Para una tabla "prueba" con col1, col2, col3, puede establecer el valor de "col2" en nulo antes de mostrar:
O establezca dos columnas en nulo antes de mostrar:
la advertencia es que "prueba" debe ser una tabla (un alias o subselección no funcionará) ya que el tipo de registro que se introduce en hstore debe estar definido.
fuente
Hay una solución que acabo de descubrir, pero requiere enviar consultas SQL desde R. Puede ser útil para los usuarios de R.
Básicamente, el
dplyr
paquete envía consultas SQL (y específicamente PostgreSQL) y acepta el-(column_name)
argumento.Entonces su ejemplo podría escribirse de la siguiente manera:
fuente
En un comentario , explica que su motivo es tener la conveniencia de no mostrar el contenido de columnas con contenido largo, en lugar de no mostrar la columna en sí:
Esto es posible, con la ayuda de una función auxiliar que reemplaza el contenido largo con
null
(cualquiertext
columna en mi ejemplo, pero lo modificaría para los tipos que desea suprimir):dbfiddle aquí
fuente
Desde la perspectiva de la aplicación, esta es una solución perezosa. Es poco probable que una aplicación sepa automáticamente qué hacer con las nuevas columnas.
Las aplicaciones del navegador de datos pueden consultar los metadatos para los datos y excluir las columnas de las consultas que se ejecutan, o seleccionar un subconjunto de los datos de la columna. Los nuevos BLOB se pueden excluir cuando se agregan. Los datos BLOB para filas particulares se pueden seleccionar a pedido.
En cualquier variante SQL que admita consultas dinámicas, la consulta se puede generar utilizando una consulta en los metadatos de las tablas. Para su intención, excluiría columnas basadas en el tipo en lugar del nombre.
fuente
Nunca se ve
*
en SQL-VIEWS ... verifique\d any_view
en supsql
. Hay un preprocesamiento (introspectivo) para la representación interna.Toda la discusión aquí muestra que la propuesta de problema (implícita en la pregunta y las discusiones) es un azúcar de sintaxis para los programadores, no un verdadero "problema de optimización de SQL" ... Bueno, supongo que es para el 80% de los programadores.
Por lo tanto, se puede implementar como " análisis previo con introspección" ... Vea lo que hace PostgreSQL cuando declara un SQL-VIEW con
SELECT *
: el constructor VIEW se transforma*
en una lista de todas las columnas (por introspección y en el momento en que ejecuta el CREAR VER código fuente).Implementación para CREATE VIEW y PREPARE
Es una implementación viable. Supongamos una tabla
t
con campos(id serial, name text, the_geom geom)
.Lo mismo para la declaración PREPARE .
... entonces, eso es posible, y eso es lo que necesita el 80% de los programadores, ¡un azúcar de sintaxis para PREPARE y VIEWS!
NOTA: por supuesto, la sintaxis viable tal vez no es
- column_name
, si hay algún conflicto en PostgreSQL, por lo que pueden sugerirEXCEPT column_name
,EXCEPT (column_name1, column_name2, ..., column_nameN)
o de otro tipo.fuente
Esta es mi función para seleccionar todas las columnas y esperar una. Combiné ideas de postgresonline.com y postgresql tuturial y de otras fuentes.
fuente