postgresql — Как я могу проверить, существует ли столбец в таблице, используя оператор SQL

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

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

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

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

45

Решение

Попробуй это :

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

Другие решения

Принятый ответ правильный, но отсутствует схема и более хороший вывод (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');
26

Это проще (и SQLi-безопасно) с 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
...
14

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

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

3

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

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

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

3

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

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
1
По вопросам рекламы [email protected]