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.