Как проверить, существует ли столбец в таблице с помощью инструкции SQL
есть ли простая альтернатива в PostgreSQL этому заявлению, созданному в Oracle?
select table_name from user_tab_columns
where table_name = myTable and column_name = myColumn;
затем я проверяю, возвращает ли запрос что-либо, чтобы доказать существование столбца.
Я знаю, что с помощью psql я могу найти их по отдельности, но это необходимо для получения результата в программе, которую я пишу, чтобы проверить, что запрошенное поле атрибута существует в моей таблице базы данных.
6 ответов
попробуйте это :
SELECT column_name
FROM information_schema.columns
WHERE table_name='your_table' and column_name='your_column';
принятый ответ правильный, но отсутствует схема и более приятный вывод (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');
Это проще (и SQLi-safe) с Postgresql's идентификатор объекта типа:
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
...
SELECT attname
FROM pg_attribute
WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'YOURTABLENAME')
AND attname = 'YOURCOLUMNNAME';
конечно, заменить YOURTABLENAME и YOURCOLUMNNAME с соответствующими значениями. Если возвращается строка, столбец с таким именем существует, в противном случае она не.
В отличие от Oracle, PostgreSQL поддерживает стандарт ANSI INFORMATION_SCHEMA
вид.
соответствующее стандартное представление для User_tab_columns Oracle -information_schema.columns
http://www.postgresql.org/docs/current/static/infoschema-columns.html
вот аналогичный вариант ответа Erwin Brandstetter. Здесь мы также проверяем схему, если у нас есть похожие таблицы в другой схеме.
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