verificar una tabla saber registro existe como columna campo agregar postgresql information-schema

postgresql - saber - ¿Cómo puedo probar si una columna existe en una tabla usando una declaración SQL?



saber si un registro existe en una tabla sql server (6)

A diferencia de Oracle, PostgreSQL admite las vistas ANSI estándar INFORMATION_SCHEMA .

La vista estándar correspondiente a las user_tab_columns de Oracle es information_schema.columns

http://www.postgresql.org/docs/current/static/infoschema-columns.html

¿Hay una alternativa simple en PostgreSQL a esta declaración producida en Oracle?

select table_name from user_tab_columns where table_name = myTable and column_name = myColumn;

Luego estoy probando si la consulta arroja algo para probar que la columna existe.

Soy consciente de que al usar psql puedo encontrarlos individualmente, pero esto es necesario para producir un resultado en un programa que estoy escribiendo para validar que existe un campo de atributo solicitado en la tabla de mi base de datos.


Aquí hay una variante similar de la respuesta de Erwin Brandstetter. Aquí también verificamos el esquema en caso de que tengamos tablas similares en diferentes esquemas.

SELECT TRUE FROM pg_attribute WHERE attrelid = ( SELECT c.oid FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname = CURRENT_SCHEMA() AND c.relname = ''YOURTABLENAME'' ) AND attname = ''YOURCOLUMNNAME'' AND NOT attisdropped AND attnum > 0


Esto es más simple (y seguro para SQLi) con los tipos de identificadores de objetos de PostgreSQL:

SELECT TRUE FROM pg_attribute WHERE attrelid = ''myTable''::regclass -- cast to a registered class (table) AND attname = ''myColumn'' AND NOT attisdropped -- exclude dropped (dead) columns -- AND attnum > 0 -- exclude system columns (you may or may not want this)

Lea sobre la importancia de las columnas en el manual .

Si está creando SQL dinámico y su nombre de columna se proporciona como parámetro, puede usar quote_ident() para evitar la inyección de SQL:

... AND attname = quote_ident(''myColumn'');

search_path funciona para tablas fuera de search_path :

... WHERE attrelid = ''mySchema.myTable''::regclass ...


La respuesta aceptada es correcta, pero falta el esquema y la salida es más agradable (Verdadero / Falso):

SELECT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=''my_schema'' AND table_name=''my_table'' AND column_name=''my_column'');


Prueba esto :

SELECT column_name FROM information_schema.columns WHERE table_name=''your_table'' and column_name=''your_column'';


SELECT attname FROM pg_attribute WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = ''YOURTABLENAME'') AND attname = ''YOURCOLUMNNAME'';

Por supuesto, reemplace YOURTABLENAME y YOURCOLUMNNAME con los valores adecuados. Si se devuelve una fila, existe una columna con ese nombre; de ​​lo contrario, no.