পোস্টজিআইএস টেবিল থেকে প্রতিটি কলামের ডেটা ধরণের পাচ্ছেন?


9

জ্যামিতির ধরণগুলি সহ আমার একটি টেবিলের সমস্ত কলামের কলামের ডেটা প্রাপ্ত হওয়া দরকার। আমি যা জানতে চেয়েছিলাম তা হল যদি কোনও ফাংশন বা এসকিউএল থাকে যা এই জাতীয় কিছু দেয়:

column_name | data_type
------------+--------------
gid         | integer
descr       | character varying(32)
class       | character varying(10)
area        | double precision
geom        | geometry(Polygon,3763)

কয়েক উত্তর থেকে stackexchange এবং gis.stackexchange আমি জানি যে আমি নিম্নলিখিত ক্যোয়ারী দিয়ে কিছু তথ্য পেতে পারেন:

SELECT 
    g.column_name,
    g.data_type,
    g.character_maximum_length,
    g.udt_name,
    f.type,
    f.srid
FROM 
     information_schema.columns as g JOIN
     geometry_columns AS f 
         ON (g.table_schema = f.f_table_schema and g.table_name = f.f_table_name )
WHERE
    table_schema = 'my_schema_name' and
    table_name = 'my_table_name'

ফলাফল:

column_name | data_type         | character_maximum_length | udt_name | type    | srid
------------+-------------------+--------------------------+----------+---------+------
gid         | integer           |                          |          |         |
descr       | character varying | 32                       |          |         |
class       | character varying | 10                       |          |         |
area        | double precision  |                          |
geom        | USER-DEFINED      |                          | geometry | Polygon | 3763

তবে, আমার প্রয়োজনীয় ফর্ম্যাটে তথ্য পুনরুদ্ধার করার জন্য কি আরও কার্যকর উপায় আছে? বা CASE WHENসেই বিন্যাসে একক কলামে সমস্ত কলামের বৈশিষ্ট্যগুলি সংগ্রহ করতে আমি কি কাঠামো এবং স্ট্রিং কনটেনটেশনের "জগতে" প্রবেশ করতে হবে?

আমার আশঙ্কাটি যদি কোনও প্রত্যাশিত ডেটা টাইপ আমাকে তথ্য_সেমিমা কলামগুলি সারণী থেকে অন্যান্য বৈশিষ্ট্যের প্রয়োজনের দ্বারা বিস্মিত করে। উদাহরণস্বরূপ, উদাহরণস্বরূপ সারণীতে, আমি কোনও numeric (15,2)ডেটা টাইপ ব্যবহার করি নি , এর পরে যখন একটি CASE WHEN দ্বারা পার্স করার জন্য অন্য বৈশিষ্ট্যগুলি (সংখ্যাসূচক_প্রজ্ঞা এবং সংখ্যাসূচক_স্কেল) ব্যবহার করা দরকার।

উত্তর:


14

তত্ত্ব হ্যাঁ, যদিও আপনি এটি সত্যিই খুব জটিল খুঁজে পেতে পারেন।

  • প্রতিটি টেবিলের (pg_class থেকে * নির্বাচন করুন) কলাম রয়েছে।
  • প্রতিটি কলামে (pg_attribute থেকে * নির্বাচন করুন) allyচ্ছিকভাবে একটি "টাইপমড" নম্বর থাকে।
  • টাইপমড সহ প্রকারের জন্য (পিজি_ টাইপ থেকে * নির্বাচন করুন) একটি "টাইপমডআউট" ফাংশন থাকবে।
  • টাইপমোড সংখ্যায় টাইপমড আউট ফাংশনটি চালানো একটি স্ট্রিং ফিরে আসবে যা আপনি ব্যবহার করতে পারেন এমন ধরণের ব্যবহারকারী-পঠনযোগ্য স্বাক্ষর তৈরির জন্য টাইপ নামের সাথে সংমিশ্রণ করা যায় ('সংখ্যাসূচক' নির্বাচন করুন || সংখ্যাসমূহকে বেছে নিন (786441)) (ভূগোল_টাইপমড_আউট নির্বাচন করুন) (1107460))

তবে, আরে, পিএসএলএল আপনার পছন্দসই স্ট্রিংগুলি তৈরি করে, যদি আমরা এটি এসকিউএলটি কী উত্পন্ন করে তা দেখি, সম্ভবত উত্তরটি সেখানে রয়েছে in

নিশ্চিতভাবেই, এখানে একটি ম্যাজিক ফাংশন রয়েছে যা টাইপড এবং টাইপমড নেয় এবং ম্যাজিক স্ট্রিংটি দেয়।

select a.attname, format_type(a.atttypid, a.atttypmod) from pg_attribute a where attname = 'geog';

Pg_class এ যোগদানের সাথে আপনি প্রতি টেবিলে এই তথ্যটি পেতে সক্ষম হবেন।


আমি এর জন্য কোনও ফল পাই না where attname = 'geog'তবে = 'geom'কাজ করে। এটি আমাকে মাল্টিপলিগন, পয়েন্ট এবং মাল্টিপয়েন্ট মানগুলির জন্য ভাল ফলাফল দেয় তবে আমি লাইন বা মাল্টলাইন ধরণের জন্য কিছুই দেখতে পাচ্ছি না। সেগুলি বহুভুজ হিসাবে বিবেচিত হয়?
mhkeller

7

এটি একটি সাধারণ এসকিউএল কোয়েরি ব্যবহার করা যেতে পারে।

SELECT * from information_schema.columns where table_name='mytablename'


1
এটি দুর্দান্ত কাজ করে! এবং এখানে একটি টিপ: আউটপুট এক ধরণের দীর্ঘ হতে পারে, তাই আপনি আপনার কনসোলটিতে প্রসারিত প্রদর্শন সক্ষম করতে পারেন: \pset pagerপৃষ্ঠাটি বন্ধ করতে, তারপরে \xপ্রসারিত প্রদর্শন সক্ষম করতে।
modulitos

7

সঙ্গে পল রামসে সাহায্যের আমি এটা এই ভাবে তৈরি করেছেন:

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 b.relname = 'my_table_name' and a.attstattarget = -1;

হালনাগাদ

ইতিমধ্যে আমি একটি নির্দিষ্ট কলামের ডেটা টাইপ জিজ্ঞাসা করার জন্য একটি ফাংশন তৈরি করেছি

CREATE OR REPLACE FUNCTION "vsr_get_data_type"(_t regclass, _c text)
  RETURNS text AS
$body$
DECLARE
    _schema text;
    _table text;
    data_type text;
BEGIN
-- Prepare names to use in index and trigger names
IF _t::text LIKE '%.%' THEN
    _schema := regexp_replace (split_part(_t::text, '.', 1),'"','','g');
    _table := regexp_replace (split_part(_t::text, '.', 2),'"','','g');
    ELSE
        _schema := 'public';
        _table := regexp_replace(_t::text,'"','','g');
    END IF;

    data_type := 
    (
        SELECT format_type(a.atttypid, a.atttypmod)
        FROM pg_attribute a 
        JOIN pg_class b ON (a.attrelid = b.oid)
        JOIN pg_namespace c ON (c.oid = b.relnamespace)
        WHERE
            b.relname = _table AND
            c.nspname = _schema AND
            a.attname = _c
     );

    RETURN data_type;
END
$body$ LANGUAGE plpgsql;

ব্যবহারটি হ'ল:

SELECT vsr_get_data_type('schema_name.table_name','column_name')

-1

আপনি যদি জ্যামিতির প্রকার পরীক্ষা করতে চান তবে আপনি 'তথ্য_সামগ্রী.ক্লুমএনএস'-তে' udt_name 'চেক করতে পারেন এবং এটি ব্যবহার করতে পারেন !:

select column_name,udt_name, data_type, character_maximum_length from INFORMATION_SCHEMA.COLUMNS where table_name =g

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.