it-swarm.asia

كيف أسرد جميع الأعمدة لجدول محدد

أبحث عن معلومة دقيقة في قاعدة بيانات لا أعلم عنها.

إنه منتج تابع لجهة خارجية ، وهم بطيئون في الإجابة عن بعض الأسئلة ، وأنا أعلم أن البيانات تقع داخل هذا الديسيبل ، لذلك أريد أن أقوم ببعض الهندسة الرجعية.

بالنظر إلى جدول واحد ، هل من الممكن أن يكون لديك قائمة بأسماء أعمدة هذا الجدول؟

على سبيل المثال في SqlServer ، من الممكن تفريغ جدول في عبارات CREATE قابلة لإعادة الاستخدام ، والتي تسرد جميع الأعمدة التي يتكون منها الجدول.

321
Stephane Rolland

بالإضافة إلى سطر الأوامر \d+ <table_name> وجدت بالفعل ، يمكنك أيضًا استخدام مخطط المعلومات للبحث عن بيانات العمود باستخدام information_schema.columns :

SELECT *
  FROM information_schema.columns
 WHERE table_schema = 'your_schema'
   AND table_name   = 'your_table'
     ;

ملاحظة: وفقًا للمثال أعلاه ، تأكد من إحاطة القيم بعلامات اقتباس.

384
bhamby

كمكمل للإجابات الأخرى ، حتى عبارة SELECT التي لا تُرجع أي صفوف ستكشف أسماء الأعمدة إليك ورمز التطبيق.

select *
from table_name
where false;

قد تلعب الأذونات مع أي من هذه الأساليب.

91
Mike Sherrill 'Cat Recall'

مخطط معلومات المعلومات هي الطريقة البطيئة والمضمونة: فهي موحدة وقابلة للنقل إلى حد كبير إلى قواعد البيانات الأخرى التي تدعمها. وستستمر في العمل عبر الإصدارات الرئيسية.

ومع ذلك ، غالبًا ما تنضم طرق العرض في مخطط المعلومات في العديد من الجداول من كتالوجات النظام لتلبية تنسيق موحد بصرامة - كثير منها مجرد شحنات ميتة معظم الوقت. هذا يجعلهم بطيئين .
لا يقدم مطورو Postgres وعودًا ، لكن الأساسيات (مثل ما هو مطلوب هنا) لن تتغير عبر الإصدارات الرئيسية.

psql (واجهة سطر الأوامر الأصلية) تأخذ المسار السريع ، بالطبع ، وتستعلم المصدر مباشرة. إذا بدأت psql بالمعلمة -E ، SQL وراء أوامر الخط المائل العكسي مثل \d يتم عرض. أو \set ECHO_HIDDEN on من سطر أوامر psql. بدءًا من هناك ، يمكنك إنشاء إجابة لسؤالك.

بالنظر إلى جدول واحد ، هل من الممكن أن يكون لديك قائمة بأسماء الأعمدة لهذا الجدول.

SELECT attrelid::regclass AS tbl
     , attname            AS col
     , atttypid::regtype  AS datatype
       -- more attributes?
FROM   pg_attribute
WHERE  attrelid = 'myschema.mytable'::regclass  -- table name, optionally schema-qualified
AND    attnum > 0
AND    NOT attisdropped
ORDER  BY attnum;

أسرع من الاستعلام information_schema.columns . محاولة EXPLAIN ANALYZE لترى بنفسك. لا يزال مهمًا جدًا للبحث مرة واحدة. ولكن قد يحدث فرقًا إذا تم استخدامه في استعلام/دالة يتم تكرارها عدة مرات.

هناك أيضًا اختلافات طفيفة في الرؤية. مقارنة تفصيلية:

76
Erwin Brandstetter

psql على PostgreSQL 11+

إذا كنت تبحث عن أنواع الأعمدة في طلب البحث ، فيمكنك استخدام psql 's \gdesc

SELECT
    NULL AS zero,
    1 AS one,
    2.0 AS two,
    'three' AS three,
    $1 AS four,
    sin($2) as five,
    'foo'::varchar(4) as six,
    CURRENT_DATE AS now
\gdesc
 Column |         Type         
--------+----------------------
 zero   | text
 one    | integer
 two    | numeric
 three  | text
 four   | text
 five   | double precision
 six    | character varying(4)
 now    | date
(8 rows)
8
Evan Carroll

PostgreSQL فقط

هذا هوكي إلى حد ما ولكن يمكن أن يكون منافسًا إذا كنت تبحث عن أقصر SQL ممكن:

SELECT json_object_keys(to_json(json_populate_record(NULL::schema_name.table_name, '{}'::JSON)))

أو حتى أقصر (بافتراض وجود صف واحد على الأقل في الجدول)

SELECT json_object_keys(to_json((SELECT t FROM schema_name.table_name t LIMIT 1)))

القائمة تحافظ على الترتيب. في حال لم تكن مهتمًا بالطلب ولديك ملحق hstore مثبت يمكنك القيام به أقصر

SELECT skeys(hstore(NULL::schema_name.table_name))
0
oᴉɹǝɥɔ