Как я могу получить имена столбцов из таблицы в Oracle?

143

Мне нужно запросить базу данных, чтобы получить имена столбцов, а не путать с данными в таблице. Например, если у меня есть таблица с именем EVENT_LOG, которая содержит eventID, eventType, eventDesc и eventTime, тогда я хочу получить эти имена полей из запроса и ничего больше.

Я нашел, как это сделать:

Но мне нужно знать: как это можно сделать в Oracle?

Теги:
database

26 ответов

129
Лучший ответ

Вы можете запросить таблицу USER_TAB_COLUMNS для метаданных столбца таблицы.

SELECT table_name, column_name, data_type, data_length
FROM USER_TAB_COLUMNS
WHERE table_name = 'MYTABLE'
  • 21
    Обратите внимание, что это относится к Oracle.
  • 5
    Есть ли какая-то причина, по которой это может вернуть «не выделено ни одной строки»? (В Oracle.)
Показать ещё 5 комментариев
69

В SQL Server...

SELECT [name] AS [Column Name]
FROM syscolumns
WHERE id = (SELECT id FROM sysobjects WHERE type = 'V' AND [Name] = 'Your table name')

Тип = 'V' для просмотров Тип = 'U' для таблиц

32

Вы можете сделать это:

describe EVENT_LOG

или

desc EVENT_LOG

Примечание: применимо только в том случае, если вы знаете имя таблицы и специально для Oracle.

24

Для SQL Server 2008 мы можем использовать information_schema.columns для получения информации о столбцах

SELECT *
FROM   information_schema.columns
WHERE  table_name = 'Table_Name'
ORDER  BY ordinal_position  
  • 1
    Обратите внимание, что таблицы INFORMATION_SCHEMA являются стандартными таблицами метаданных ANSI. Любая хорошая, современная СУБД будет иметь их.
17

Для SQLite я считаю, что вы можете использовать что-то вроде следующего:

PRAGMA table_info(table-name);

Объяснение из sqlite.org:

Эта прагма возвращает одну строку для каждого столбца в названной таблице. Столбцы в результирующем наборе включают имя столбца, тип данных, может ли столбец NULL или значение по умолчанию для столбца. Столбец "pk" в результирующем наборе равен нулю для столбцов, которые не являются частью первичного ключа, и является индексом столбца в первичном ключе для столбцов, которые являются частью первичного ключа.

См. также: Sqlite.org Информация о таблице Pragma

  • 1
    Я не уверен, почему за меня тоже проголосовали, но я рад, что это помогло тебе.
  • 2
    Возможно, это было отвергнуто, потому что вопрос помечен как Oracle.
Показать ещё 1 комментарий
9

Эта информация хранится в системной таблице ALL_TAB_COLUMNS:

SQL> select column_name from all_tab_columns where table_name = 'DUAL';

DUMMY

Или вы могли бы DESCRIBE использовать таблицу, если вы используете SQL * PLUS:

SQL> desc dual
Name                               Null?    Type
----------------------------------------------------- -------- ---------------------- -------------
DUMMY                               VARCHAR2(1)
  • 0
    Официальная документация на ALL_TAB_COLUMNS через официальную ALL_TAB_COLUMNS на базу данных Oracle. В этом представлении описываются столбцы таблиц, представлений и кластеров, доступные текущему пользователю.
7

Другие ответы достаточно отвечают на вопрос, но я думал, что поделюсь дополнительной информацией. Другие описывают синтаксис таблицы DESCRIBE, чтобы получить информацию о таблице. Если вы хотите получить информацию в том же формате, но без использования DESCRIBE, вы можете сделать:

SELECT column_name as COLUMN_NAME, nullable || '       ' as BE_NULL,
  SUBSTR(data_type || '(' || data_length || ')', 0, 10) as TYPE
 FROM all_tab_columns WHERE table_name = 'TABLENAME';

Наверное, не имеет большого значения, но я написал его раньше и, кажется, подходит.

  • 0
    Пытаясь это сейчас (несколько лет спустя) в SQL Server 2008, я получаю Incorrect Syntax near '|' ошибка
3

Для SQL Server:

SELECT [name] AS [Column Name]
FROM syscolumns
WHERE id = object_id('TABLE_NAME')
3

Для MySQL используйте

SELECT column_name 
FROM information_schema.columns 
WHERE 
table_schema = 'Schema' AND table_name = 'Table_Name'
3
select column_name,* from information_schema.columns
 where table_name = 'YourTableName'
order by ordinal_position
  • 0
    работает ли этот запрос, с указанием имени col и звезды- "select column_name, *" .. Он не работает в Oracle.
2
SELECT COLUMN_NAME 'all_columns' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='user';
  • 0
    Добро пожаловать на переполнение стека @expert one. Даже если ваш ответ кажется точным, добавьте больше подробностей и объяснений, чем просто «код». Это было бы понятнее для всех.
2

Даже это также один из способов его использования

select * from product where 1 != 1
2
describe YOUR_TABLE;

В вашем случае:

describe EVENT_LOG;
2

Для Oracle

SELECT column_name FROM user_tab_cols WHERE table_name=UPPER('tableName');
1

Mysql

SHOW COLUMNS FROM a_table_named_users WHERE Field REGEXP 'user_id|user_name|user_pass'

Это вернет результат примерно так:

Field     |  Type        |   Null   |   Key   |   Default   |   Extra  
user_id      int(8)          NO         PRI       NULL          auto_increment
user_name    varchar(64)     NO         MUL       NULL
user_pass    varchar(64)     NO                   NULL

Затем, чтобы вытащить значения, вы можете просто

fetch row[0]

Это также отлично подходит для динамического ввода данных, так как REGEXP нуждается в '|' для нескольких входов, но также способ сохранить разделенные данные и легко хранить/передавать классы/функции.

Попробуйте бросить фиктивные данные, а также для обеспечения безопасности при отправке и сравнить то, что было возвращено при получении каких-либо ошибок.

1

Вы также можете попробовать это, но это может быть больше информации, чем вам нужно:

sp_columns TABLE_NAME
0

В Oracle существует два представления, описывающие столбцы:

  • DBA_TAB_COLUMNS описывает столбцы всех таблиц, представлений и кластеров в базе данных.

  • USER_TAB_COLUMNS описывает столбцы таблиц, представлений и кластеров, принадлежащих текущему пользователю. В этом представлении не отображается OWNER.

0

вы можете запустить этот запрос

SELECT t.name AS table_name,
SCHEMA_NAME(schema_id) AS schema_name,
c.name AS column_name
FROM sys.tables AS t
INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
WHERE c.name LIKE '%%' --if you want to find specific column write here 
ORDER BY schema_name, table_name;
0
SELECT A.COLUMN_NAME, A.* FROM all_tab_columns a 
WHERE table_name = 'Your Table Name'
AND A.COLUMN_NAME = 'COLUMN NAME' AND a.owner = 'Schema'
  • 0
    Пожалуйста, объясните ваш код.
0

Ответ здесь: http://php.net/manual/en/function.mysql-list-fields.php Я бы использовал следующий код в вашем случае:

$result = mysql_query("SHOW COLUMNS FROM sometable");
if (!$result) {
    echo 'Could not run query: ' . mysql_error();
    exit;
}
$fields = array();
if (mysql_num_rows($result) > 0) {
    while ($row = mysql_fetch_assoc($result)) {
        $fields[] = $row['Field'];
    }
}
-1

Запрос для выбора сведений о столбцах в SQL 2008

DECLARE @tableName varchar(20)='item'
SELECT UPPER(COLUMN_NAME)columnname
,DATA_TYPE+(CASE DATA_TYPE WHEN 'numeric' THEN '('+CAST(NUMERIC_PRECISION AS varchar)+','+CAST(NUMERIC_PRECISION_RADIX AS varchar)+')'
                WHEN 'varchar' THEN '('+CAST(CHARACTER_MAXIMUM_LENGTH AS varchar)+')'
                ELSE ''  END)
,'DECLARE @'+COLUMN_NAME+' '+DATA_TYPE+(CASE DATA_TYPE WHEN 'numeric' THEN '('+CAST(NUMERIC_PRECISION AS varchar)+','+CAST(NUMERIC_PRECISION_RADIX AS varchar)+')'
                WHEN 'varchar' THEN '('+CAST(CHARACTER_MAXIMUM_LENGTH AS varchar)+')'
                ELSE ''  END) Declaration
,'@'+ UPPER(COLUMN_NAME)+' '+DATA_TYPE+(CASE DATA_TYPE WHEN 'numeric' THEN '('+CAST(NUMERIC_PRECISION AS varchar)+','+CAST(NUMERIC_PRECISION_RADIX AS varchar)+')'
                WHEN 'varchar' THEN '('+CAST(CHARACTER_MAXIMUM_LENGTH AS varchar)+')'
                ELSE ''  END)+',' XMLDeclare
,'@'+COLUMN_NAME+',' Assign
,COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,NUMERIC_PRECISION,NUMERIC_PRECISION_RADIX
-1

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

select * from sys.all_columns c join sys.objects o on c.object_id=o.object_id where o.name = 'TABLENAME' and c.name like '%COLUMN NAME%'
-2
SELECT COLUMN_NAME 
FROM YourDatabase.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'YourTableName'
-2

В этом вопросе вы искали доступ к именам столбцов в Teradata, поэтому я добавлю ответ за их "вкус" SQL:

SELECT ColumnName
FROM DBC.Columns
WHERE DatabaseName='DBASE_NAME'
AND TableName='TABLE_NAME';

Информация хранится в базе данных DBC.

Получение типов данных немного более активно: Получить тип столбца с использованием системных таблиц Teradata

-2

Просто выберите первую строку из таблицы, для оракула: select * from <table name> where rownum = 1;

  • 0
    Что означает rownum? Нужно ли использовать столбец с именем rownum?
-3

Я сделал это так:

SELECT 
    TOP 0
    *
FROM
    Posts

Он работает даже в http://data.stackexchange.com, чьи служебные таблицы мне неизвестны!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню