পোস্টগ্রিসে ক্ষেত্রটির ডেটাটাইপ নির্বাচন করুন


165

পোস্টগ্রিসে সারণী থেকে নির্দিষ্ট ক্ষেত্রের ডেটাটাইপ কীভাবে পাব? উদাহরণস্বরূপ আমার কাছে নীচের সারণী, ছাত্র_র বিবরণ (স্টু_আইডি পূর্ণসংখ্যা, স্টু_নাম বর্ণাচর (30), যোগদান_ তারিখের টাইমস্ট্যাম্প) রয়েছে;

এতে ক্ষেত্রের নাম / বা অন্য কোনও উপায় ব্যবহার করে, আমাকে নির্দিষ্ট ক্ষেত্রের ডেটাটাইপ পেতে হবে। কোন সম্ভাবনা আছে?


1
এছাড়াও জিজ্ঞাসা করা হয় & বললেন stackoverflow.com/q/20194806/65458
পাযত্র Findeisen

উত্তর:


173

আপনি এর থেকে ডেটা প্রকার পেতে পারেন information_schema (8.4 ডক্স এখানে উল্লিখিত, কিন্তু এই একটি নতুন বৈশিষ্ট্য নয়):

=# select column_name, data_type from information_schema.columns
-# where table_name = 'config';
    column_name     | data_type 
--------------------+-----------
 id                 | integer
 default_printer_id | integer
 master_host_enable | boolean
(3 rows)

এত সহজ এবং সুন্দর! এখন আমি বর্তমান ক্যোয়ারীটি প্রতিস্থাপন করতে পারি যে আমি দেখতে পেয়েছি যে এটি 310 টি অক্ষর (টেবিলের নাম ছাড়াই), 4 টেবিলের যোগ, স্কিমা সচেতন নয়, ব্যয়বহুল এবং এটি 'ইনট 4' এবং অন্যান্যকে পূর্ণসংখ্যার পরিবর্তে টাইপ হিসাবে দেয়। ধন্যবাদ!
কিছু

2
পোস্টগ্রিএসকিউএল আপনাকে একাধিক স্কিমে একই টেবিলের নাম (এমনকি একটি অভিন্ন টেবিল) রাখতে দেয়। লেখার শক্তিশালী উপায়ে যেখানে এই ধারাটি সেই সম্ভাবনাটিকে বিবেচনা করে: where table_catalog = ? and table_schema = ? and table_name = ?;তবে এই তথ্য_স্কিমার দৃষ্টিভঙ্গি বিবেচনা করে না যে ডিডিএল হয়ত ডোমেন ব্যবহার করেছে ।
মাইক শেরিল 'ক্যাট রিকল'

1
এটি আপনাকে অ্যারের ধরণের ধরণ দেবে না, সুতরাং এটি পাশাপাশি ব্যবহার করতে হবেpg_typeof
দারিয়া

146

আপনি pg_typeof () ফাংশনটি ব্যবহার করতে পারেন , যা স্বেচ্ছাসেবী মানের জন্য ভাল কাজ করে।

SELECT pg_typeof("stu_id"), pg_typeof(100) from student_details limit 1;

এটি সারণীতে রেকর্ড প্রতি এক সারি দেয়। যদি আপনার কয়েক মিলিয়ন রেকর্ড থাকে তবে এটি চালাবেন না
সারাং

3
আপনার কোনও গণনার ধরণ নির্ধারণ করার প্রয়োজন হলে এটি সুন্দরভাবে কাজ করে। উদাহরণস্বরূপ, SELECT pg_typeof( date_part( 'year', now() ) ) AS exprসম্ভবত আপনি যা আশা করেন তার চেয়ে আলাদা।
লিও ওরিয়েন্টিস

এখানে চতুর জিনিসটি হ'ল pg_typeofসঞ্চিত পদ্ধতিগুলি থেকে বেরিয়ে আসা ক্ষেত্রগুলির জন্য কাজ করে, যার জন্য ব্যাকএন্ড সারণী, এমনকি এটি উপস্থিত থাকলেও অজানা / অস্পষ্ট। select state, qstart, pg_typeof(qstart) as ty_qstart from listconn()। তথ্য_সেমিমা এখানে খুব বেশি সাহায্য করবে না।
জেএল পেয়ারেট


38

psql -Eএবং তারপর চালান\d student_details


সহজ এবং দরকারী
হরিয়ই

11

আপনি যদি 'মাইক শেরিল' সমাধানটি পছন্দ করেন তবে পিএসকিএল ব্যবহার করতে না চান, আমি অনুপস্থিত তথ্য পেতে এই জিজ্ঞাসাটি ব্যবহার করেছি:

select column_name,
case 
    when domain_name is not null then domain_name
    when data_type='character varying' THEN 'varchar('||character_maximum_length||')'
    when data_type='numeric' THEN 'numeric('||numeric_precision||','||numeric_scale||')'
    else data_type
end as myType
from information_schema.columns
where table_name='test'

ফলাফল সহ:

column_name |     myType
-------------+-------------------
 test_id     | test_domain
 test_vc     | varchar(15)
 test_n      | numeric(15,3)
 big_n       | bigint
 ip_addr     | inet

8

তথ্য স্কিমা দর্শন এবং pg_typeof () অসম্পূর্ণ প্রকারের তথ্য ফেরত দেয়। এই উত্তরগুলির মধ্যে, psqlসুনির্দিষ্ট ধরণের তথ্য দেয়। (ওপিকে এই জাতীয় সুনির্দিষ্ট তথ্যের প্রয়োজন না হতে পারে তবে সীমাবদ্ধতাগুলি জানা উচিত))

create domain test_domain as varchar(15);

create table test (
  test_id test_domain, 
  test_vc varchar(15), 
  test_n numeric(15, 3), 
  big_n bigint,
  ip_addr inet
);

ব্যবহার করা psqlএবং \d public.testসঠিকভাবে ডেটা টাইপ test_domain, বর্ণের (এন) কলামগুলির দৈর্ঘ্য এবং সংখ্যাসূচক (পি, গুলি) কলামগুলির যথার্থতা এবং স্কেল প্রদর্শন করা হয়।

স্যান্ডবক্স = # \ d সর্বজনীন
             সারণী "পাবলিক.টেষ্ট"
 কলাম | প্রকার | সংশোধনকারীদের
--------- + + ----------------------- + + -----------
 পরীক্ষা_আইডি | পরীক্ষা_ডোমেন |
 পরীক্ষা_ভিসি | চরিত্রের পার্থক্য (15) |
 পরীক্ষা_এন | সংখ্যাযুক্ত (15,3) |
 বড়_এন | বিগিন্ট |
 ip_addr | inet |

কোনও তথ্য_স্কেমা ভিউয়ের বিরুদ্ধে এই ক্যোয়ারীটি একেবারেই ব্যবহারটি দেখায় নাtest_domain । এটি ভারচার (এন) এবং সংখ্যাসূচক (পি, গুলি) কলামগুলির বিবরণও প্রতিবেদন করে না।

select column_name, data_type 
from information_schema.columns 
where table_catalog = 'sandbox'
  and table_schema = 'public'
  and table_name = 'test';
কলাম_নাম | data_type
------------- + + -------------------
 পরীক্ষা_আইডি | চরিত্র বিভিন্ন
 পরীক্ষা_ভিসি | চরিত্র বিভিন্ন
 পরীক্ষা_এন | সাংখ্যিক
 বড়_এন | bigint
 ip_addr | Inet

আপনি পারে সব, বা সিস্টেম টেবিল সরাসরি অনুসন্ধান দ্বারা অন্যান্য information_schema মতামত যোগদান করে সেই তথ্য পেতে সক্ষম হবেন। psql -Eযে সাহায্য করতে পারে।

ফাংশনটি pg_typeof()সঠিকভাবে ব্যবহারের দেখায় test_domain, তবে বর্ণা (এন) এবং সংখ্যাসূচক (পি, গুলি) কলামগুলির বিশদটি রিপোর্ট করে না।

select pg_typeof(test_id) as test_id, 
       pg_typeof(test_vc) as test_vc,
       pg_typeof(test_n) as test_n,
       pg_typeof(big_n) as big_n,
       pg_typeof(ip_addr) as ip_addr
from test;
   পরীক্ষা_আইডি | পরীক্ষা_ভিসি | পরীক্ষা_এন | বড়_এন | ip_addr
------------- + + ------------------- + + --------- + + ------ - + + ---------
 পরীক্ষা_ডোমেন | চরিত্রের পার্থক্য | সংখ্যা | বিগিন্ট | Inet

4

থেকে ডেটা ধরণের টানানো information_schemaসম্ভব, তবে সুবিধাজনক নয় (একটি caseবিবৃতি সহ কয়েকটি কলামে যোগদানের প্রয়োজন )। বিকল্পভাবে কেউ এটি করতে format_typeঅন্তর্নির্মিত ফাংশনটি ব্যবহার করতে পারে তবে এটি অভ্যন্তরীণ ধরণের শনাক্তকারীদের উপর কাজ করে যা এতে প্রদর্শিত হয় pg_attributeতবে তা না information_schema। উদাহরণ

SELECT a.attname as column_name, format_type(a.atttypid, a.atttypmod) AS data_type
FROM pg_attribute a JOIN pg_class b ON a.attrelid = b.relfilenode
WHERE a.attnum > 0 -- hide internal columns
AND NOT a.attisdropped -- hide deleted columns
AND b.oid = 'my_table'::regclass::oid; -- example way to find pg_class entry for a table

Https://gis.stackexchange.com/a/97834 উপর ভিত্তি করে ।


1
বংশধরগণ জন্য, pg10 প্রতিস্থাপন b.relfilenodeসঙ্গেb.oid
tswaters
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.