2012-04-03 11 views
36

¿Existe una alternativa simple en PostgreSQL a esta declaración producida en Oracle?¿Cómo puedo probar si una columna existe en una tabla usando una declaración SQL?

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

estoy a continuación, comprobar si la consulta devuelve nada a fin de demostrar que existe la columna.

Soy consciente de que el uso de psql I puede 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.

Respuesta

75

Prueba esto:

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

Gracias. Aceptado como respuesta ya que es una alternativa directa a lo que estaba haciendo en Oracle. – CSharpened

+0

funciona de la misma manera en MySQL, lo cual es bueno – Evgeny

+0

@CSharpened ¿cuál es la consulta para Oracle? – Evgeny

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

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

+0

Gracias por la respuesta. Aunque su ejemplo funciona bien, he optado por aceptar la respuesta de Ramandeeps debido a su simplicidad y al hecho de que parece ser una alternativa más directa a mi problema. – CSharpened

13

Esto es más sencillo (y SQLi-seguro) con PostgreSQL de object identifier types:

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 significance of the columns in the manual.

Si usted está construyendo SQL dinámico y el nombre de la columna se suministra como parámetro, es posible que desee utilizar quote_ident() para evitar la inyección de SQL:

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

funciona para tablas fuera del search_path, también:

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

respuesta aceptada es correcta, pero no se encuentra el esquema y la salida 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'); 
0

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 
Cuestiones relacionadas