ฉันจะรับชื่อคอลัมน์จากตารางใน Oracle ได้อย่างไร


184

ฉันต้องการสืบค้นฐานข้อมูลเพื่อรับชื่อคอลัมน์เพื่อไม่ให้สับสนกับข้อมูลในตาราง ตัวอย่างเช่นถ้าผมมีตารางชื่อEVENT_LOGที่มีeventID, eventType, eventDescและeventTimeแล้วฉันจะต้องการดึงข้อมูลชื่อเขตข้อมูลเหล่านั้นจากการสอบถามและไม่มีอะไรอื่น

ฉันพบวิธีการทำสิ่งนี้ใน:

แต่ฉันจำเป็นต้องรู้: สิ่งนี้สามารถทำได้ในOracle ?

คำตอบ:


191

คุณสามารถสืบค้นตาราง USER_TAB_COLUMNS สำหรับเมตาดาต้าคอลัมน์ตาราง

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

21
โปรดทราบว่านี่เป็นข้อมูลเฉพาะของ Oracle
ConcOfOfTunbridgeWells

8
มีเหตุผลใดบ้างที่สิ่งนี้สามารถส่งคืน "ไม่มีการเลือกแถว"? (ใน Oracle)
Ian R. O'Brien

9
หากคุณมี 'ไม่มีแถวที่เลือก' จากนั้นคุณอาจจะพยายามที่จะเปลี่ยนแปลงไปUSER_TAB_COLUMNS all_tab_columnsเพื่อให้แน่ใจ 100% เกี่ยวกับผลลัพธ์คุณสามารถเป็นเจ้าของได้
Dracontis

2
คุณสามารถเพิ่ม "ORDER by column_id" ในกรณีที่คุณต้องการดึงข้อมูลในลำดับเดียวกันกับที่สร้างขึ้นในตาราง นี่คือข้อมูลคอลัมน์อื่น ๆ ที่เกี่ยวข้องจากตารางdocs.oracle.com/cd/B19306_01/server.102/b14237/…
Bernauer

2
ตรวจสอบให้แน่ใจว่าชื่อตารางเป็นตัวพิมพ์ใหญ่
Hugh Seagraves

67

ใน SQL Server ...

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

Type = 'V' สำหรับการดู Type = 'U' สำหรับตาราง


39

คุณสามารถทำได้:

describe EVENT_LOG

หรือ

desc EVENT_LOG

หมายเหตุ: ใช้ได้เฉพาะเมื่อคุณทราบชื่อตารางและเฉพาะสำหรับ Oracle


26

สำหรับ SQL Server 2008 เราสามารถใช้ information_schema.columns เพื่อรับข้อมูลคอลัมน์

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

1
โปรดทราบว่าINFORMATION_SCHEMAตารางนั้นเป็นตารางข้อมูลเมตามาตรฐาน ANSI RDBMS ที่ดีและทันสมัยใด ๆ จะมีพวกเขา
Bacon Bits

18

สำหรับ SQLite ฉันเชื่อว่าคุณสามารถใช้สิ่งต่อไปนี้:

PRAGMA table_info(table-name);

คำอธิบายจาก sqlite.org:

pragma นี้ส่งคืนหนึ่งแถวสำหรับแต่ละคอลัมน์ในตารางที่มีชื่อ คอลัมน์ในชุดผลลัพธ์ประกอบด้วยชื่อคอลัมน์ชนิดข้อมูลไม่ว่าคอลัมน์นั้นจะเป็น NULL หรือไม่และค่าเริ่มต้นสำหรับคอลัมน์นั้น คอลัมน์ "pk" ในชุดผลลัพธ์เป็นศูนย์สำหรับคอลัมน์ที่ไม่ได้เป็นส่วนหนึ่งของคีย์หลักและเป็นดัชนีของคอลัมน์ในคีย์หลักสำหรับคอลัมน์ที่เป็นส่วนหนึ่งของคีย์หลัก

ดูเพิ่มเติมที่: Sqlite.org Pragma ข้อมูลตาราง


1
ฉันไม่แน่ใจว่าทำไมฉันถึงลงคะแนนอย่างใดอย่างหนึ่ง แต่ฉันดีใจที่มันช่วยคุณ
shieldstroy

2
อาจถูกลดระดับลงเนื่องจากคำถามถูกแท็ก Oracle
Burhan Ali

2
ฉันลบแท็ก Oracle แล้วอัปเดตสิ่งนี้ - ฉันคิดเพราะมีคำตอบมากมายคำถามนี้ใช้ได้ดีกว่าแท็กทั่วไป (ฉันมาที่นี่เพื่อค้นหา mySQL หนึ่ง)
icedwater

16

ข้อมูลนั้นถูกเก็บไว้ใน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)

เอกสารอย่างเป็นทางการเกี่ยวกับการALL_TAB_COLUMNSผ่านทางเว็บไซต์อย่างเป็นทางการของออราเคิลฐานข้อมูลอ้างอิง มุมมองนี้อธิบายคอลัมน์ของตารางมุมมองและกลุ่มที่ผู้ใช้ปัจจุบันสามารถเข้าถึงได้
นาย Polywhirl

แต่เราไม่สามารถให้ชื่อสคีมาที่หน้าโต๊ะใช่มั้ย เช่นถ้าฉันต้องการสิ่งนี้ select column_name from all_tab_columns where table_name = 'dbo.usertbl';
AhammadaliPK

9

คำตอบอื่น ๆ เพียงพอตอบคำถาม แต่ฉันคิดว่าฉันจะแบ่งปันข้อมูลเพิ่มเติมบางอย่าง คนอื่นอธิบายไวยากรณ์ "ตาราง 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';

อาจจะไม่สำคัญมาก แต่ฉันเขียนไว้ก่อนหน้านี้และดูเหมือนว่าจะพอดี


ลองตอนนี้ (ปีต่อ ๆ ไป) ใน SQL Server 2008 ฉันได้รับIncorrect Syntax near '|'ข้อผิดพลาด
Al Lelopath


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

แบบสอบถามนี้ใช้งานได้หรือไม่โดยการระบุชื่อ col และ star- "select column_name, *" .. มันไม่ทำงานใน Oracle
Teja



3

แม้แต่นี่ก็เป็นวิธีหนึ่งที่เราสามารถใช้งานได้

select * from product where 1 != 1


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

ยินดีต้อนรับสู่ Stack Overflow @expert one แม้ว่าคำตอบของคุณจะถูกต้องโปรดเพิ่มรายละเอียดและคำอธิบายมากกว่า juste 'code' มันจะชัดเจนสำหรับทุกคน
Jean-Rémy Revy

1

คุณสามารถลองสิ่งนี้ได้ แต่มันอาจเป็นข้อมูลมากกว่าที่คุณต้องการ:

sp_columns TABLE_NAME

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

ใน Oracle มีสองมุมมองที่อธิบายคอลัมน์:

  • DBA_TAB_COLUMNS อธิบายคอลัมน์ของตารางมุมมองและกลุ่มทั้งหมดในฐานข้อมูล

  • USER_TAB_COLUMNS อธิบายถึงคอลัมน์ของตารางมุมมองและ
    กลุ่มที่ผู้ใช้ปัจจุบันเป็นเจ้าของ มุมมองนี้ไม่แสดง
    คอลัมน์ของเจ้าของ


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


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;

-1

เพียงเลือกแถวแรกจากตารางสำหรับ oracle: select * from <table name> where rownum = 1;


rownum หมายถึงอะไร ฉันต้องใช้คอลัมน์ชื่อ rownum หรือไม่?
merve bıçakçı

-1

ข้ามคำถามนี้เพื่อค้นหาการเข้าถึงชื่อคอลัมน์ใน Teradata ดังนั้นฉันจะเพิ่มคำตอบสำหรับ 'รสชาติ' ของ SQL:

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

ข้อมูลถูกเก็บไว้ใน DBC dbase

การรับชนิดข้อมูลมีความเกี่ยวข้องเพิ่มขึ้นเล็กน้อย: รับ ชนิดคอลัมน์โดยใช้ตารางระบบ teradata


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


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.