Làm thế nào tôi có thể nhận được tên cột từ một bảng trong Oracle?


184

Tôi cần truy vấn cơ sở dữ liệu để lấy tên cột , không bị nhầm lẫn với dữ liệu trong bảng. Ví dụ, nếu tôi có một bảng tên EVENT_LOGcó chứa eventID, eventType, eventDesc, và eventTime, sau đó tôi muốn lấy những tên trường từ các truy vấn và không có gì khác.

Tôi tìm thấy làm thế nào để làm điều này trong:

Nhưng tôi cần biết: làm thế nào điều này có thể được thực hiện trong Oracle ?

Câu trả lời:


191

Bạn có thể truy vấn bảng USER_TAB_COLUMNS để biết siêu dữ liệu của cột bảng.

SELECT table_name, column_name, data_type, data_length
FROM USER_TAB_COLUMNS
WHERE table_name = 'MYTABLE'

21
Lưu ý rằng điều này là dành riêng cho Oracle.
Mối quan

8
Có bất kỳ lý do tại sao điều này có thể trả về "không có hàng được chọn"? (Tại Oracle.)
Ian R. O'Brien

9
Nếu bạn có 'không có hàng nào được chọn' thì bạn có thể thử đổi USER_TAB_COLUMNSthành all_tab_columns. Để chắc chắn 100% về kết quả, bạn có thể sở hữu speficy.
Dracontis

2
Bạn có thể thêm "ĐẶT HÀNG theo cột_id" trong trường hợp bạn muốn truy xuất chúng theo cùng thứ tự chúng đã được tạo trong bảng. Dưới đây là một số dữ liệu cột có liên quan khác từ bảng docs.oracle.com/cd/B19306_01/server.102/b14237/ mẹo
Bernauer

2
Hãy chắc chắn rằng tên bảng là chữ hoa.
Hugh Seagraves

67

Trong máy chủ SQL ...

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

Loại = 'V' cho lượt xem Loại = 'U' cho bảng


39

Bạn có thể làm được việc này:

describe EVENT_LOG

hoặc là

desc EVENT_LOG

Lưu ý: chỉ áp dụng nếu bạn biết tên bảng và đặc biệt dành cho Oracle.


26

Đối với SQL Server 2008, chúng tôi có thể sử dụng information_schema.columns để lấy thông tin cột

SELECT *
FROM   information_schema.columns
WHERE  table_name = 'Table_Name'
ORDER  BY ordinal_position  

1
Lưu ý rằng các INFORMATION_SCHEMAbảng là các bảng siêu dữ liệu tiêu chuẩn ANSI. Bất kỳ RDBMS tốt, hiện đại nào cũng sẽ có chúng.
Bacon Bits

18

Đối với SQLite tôi tin rằng bạn có thể sử dụng một cái gì đó như sau:

PRAGMA table_info(table-name);

Giải thích từ sqlite.org:

Pragma này trả về một hàng cho mỗi cột trong bảng được đặt tên. Các cột trong tập kết quả bao gồm tên cột, kiểu dữ liệu, liệu cột có thể là NULL hay không và giá trị mặc định cho cột. Cột "pk" trong tập kết quả bằng 0 đối với các cột không phải là một phần của khóa chính và là chỉ mục của cột trong khóa chính cho các cột là một phần của khóa chính.

Xem thêm: Thông tin bảng Smaite.org


1
Tôi không chắc tại sao tôi lại bị bỏ phiếu, nhưng tôi rất vui vì nó đã giúp bạn.
Shieldstroy

2
Nó có thể đã bị hạ cấp vì câu hỏi được gắn thẻ Oracle.
Burhan Ali

2
Tôi đã xóa thẻ Oracle và nâng cấp nó - tôi đoán vì có rất nhiều câu trả lời câu hỏi này hoạt động tốt hơn như một câu hỏi chung. (Tôi đến đây để tìm
my my

16

Thông tin đó được lưu trữ trong ALL_TAB_COLUMNSbảng hệ thống:

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

DUMMY

Hoặc bạn có thể DESCRIBEbảng nếu bạn đang sử dụng SQL * PLUS:

SQL> desc dual
Name                               Null?    Type
----------------------------------------------------- -------- ---------------------- -------------
DUMMY                               VARCHAR2(1)

Tài liệu chính thức về ALL_TAB_COLUMNSthông qua Tài liệu tham khảo cơ sở dữ liệu chính thức của Oracle . Khung nhìn này mô tả các cột của bảng, dạng xem và cụm có thể truy cập đối với người dùng hiện tại.
Ông Polywhirl

Nhưng chúng ta không thể đặt tên lược đồ trước bảng, phải không? ví dụ nếu tôi muốn như thế này select column_name from all_tab_columns where table_name = 'dbo.usertbl';
AhammadaliPK

9

Các câu trả lời khác đủ trả lời câu hỏi, nhưng tôi nghĩ rằng tôi sẽ chia sẻ một số thông tin bổ sung. Những người khác mô tả cú pháp "bảng mô tả" để lấy thông tin bảng. Nếu bạn muốn nhận thông tin ở cùng định dạng, nhưng không sử dụng MÔ TẢ, bạn có thể làm:

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';

Có lẽ không quan trọng lắm, nhưng tôi đã viết nó sớm hơn và nó có vẻ phù hợp.


Thử ngay bây giờ (năm sau) trong SQL Server 2008, tôi gặp Incorrect Syntax near '|'lỗi
Al Lelopath

4

Đối với Oracle

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

3
select column_name,* from information_schema.columns
 where table_name = 'YourTableName'
order by ordinal_position

truy vấn này có hoạt động không, với việc chỉ định tên col và sao- "chọn cột_name, *" .. Nó không hoạt động trong Oracle.
Teja

3
describe YOUR_TABLE;

Trong trường hợp của bạn :

describe EVENT_LOG;

3

Đối với MySQL, sử dụng

SELECT column_name 
FROM information_schema.columns 
WHERE 
table_schema = 'Schema' AND table_name = 'Table_Name'

3

Thậm chí đây cũng là một trong những cách chúng ta có thể sử dụng nó

select * from product where 1 != 1

2

Đối với máy chủ SQL:

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

2
SELECT COLUMN_NAME 'all_columns' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='user';

Chào mừng bạn đến với Stack Overflow @expert. Ngay cả khi câu trả lời của bạn có vẻ chính xác, vui lòng thêm nhiều chi tiết và giải thích hơn là "mã". Nó sẽ rõ ràng hơn cho tất cả mọi người.
Jean-Rémy Revy

1

Bạn cũng có thể thử điều này, nhưng nó có thể là nhiều thông tin hơn bạn cần:

sp_columns TABLE_NAME

1

Mysql

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

Điều này sẽ trả về một kết quả như thế này:

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

Sau đó, để lấy ra các giá trị bạn có thể chỉ đơn giản là

fetch row[0]

Điều này cũng tuyệt vời để chuyển động đầu vào một cách linh hoạt vì REGEXP cần '|' cho nhiều đầu vào, nhưng cũng là một cách để giữ dữ liệu tách biệt và dễ dàng lưu trữ / chuyển đến các lớp / hàm.

Hãy thử gửi dữ liệu giả để bảo mật khi gửi nó ra và so sánh những gì được trả lại khi nhận được bất kỳ lỗi nào.


1

Trong Oracle, có hai khung nhìn mô tả các cột:

  • DBA_TAB_COLUMNS mô tả các cột của tất cả các bảng, dạng xem và cụm trong cơ sở dữ liệu.

  • USER_TAB_COLUMNS mô tả các cột của bảng, dạng xem và
    cụm được sở hữu bởi người dùng hiện tại. Khung nhìn này không hiển thị
    cột OWNER.


0

Câu trả lời là ở đây: http://php.net/manual/en/feft.mysql-list-fields.php Tôi sẽ sử dụng mã sau đây trong trường hợp của bạn:

$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'];
    }
}

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

bạn có thể chạy truy vấn này

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;

-1

Chỉ cần chọn hàng đầu tiên từ bảng, cho orory: select * from <table name> where rownum = 1;


Rownum có nghĩa là gì? Tôi có cần sử dụng một cột có tên rownum không?
merve bıçakçı

-1

Đi qua câu hỏi này để tìm kiếm quyền truy cập vào tên cột trên Teradata, vì vậy tôi sẽ thêm câu trả lời cho 'hương vị' của SQL:

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

Thông tin được lưu trữ trong DBC dbase.

Nhận các kiểu dữ liệu có liên quan nhiều hơn một chút: Nhận loại cột bằng bảng hệ thống siêu dữ liệu


-1

Thử cái này

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%'


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.