Как проверить, существует ли столбец в таблице, используя инструкцию SQL

Есть ли простая альтернатива в PostgreSQL для этого оператора, созданного в Oracle?

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

Затем я проверяю, возвращает ли запрос что-либо, чтобы доказать, что столбец существует.

Я знаю, что с помощью psql я могу найти их отдельно, но это необходимо для получения результата в программе, которую я пишу, чтобы проверить, что поле запрашиваемых атрибутов существует в моей таблице базы данных.

Ответ 1

Попробуйте следующее:

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

Ответ 2

Принятый ответ правильный, но отсутствует схема и более приятный вывод (True/False):

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

Ответ 3

Это проще (и SQLi-safe) с 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)

Узнайте о значении столбцов в руководстве.

Если вы создаете динамический SQL и в качестве параметра указывается имя столбца, вы можете использовать quote_ident(), чтобы избежать SQL-инъекции:

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

Работает для таблиц вне search_path тоже:

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

Ответ 4

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

Конечно, замените YOURTABLENAME и YOURCOLUMNNAME на правильные значения. Если строка возвращается, столбец с таким именем существует, иначе это не так.

Ответ 5

В отличие от Oracle, PostgreSQL поддерживает стандартные представления INFORMATION_SCHEMA ANSI.

Соответствующее стандартное представление Oracle user_tab_columns равно information_schema.columns

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

Ответ 6

Вот аналогичный вариант ответа Эрвина Брандстретера. Здесь мы также проверяем схему, если у нас есть похожие таблицы в разных схемах.

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