উত্তর:
টেস্টবেড:
create role stack;
create schema authorization stack;
set role stack;
create table my_table as
select generate_series(0,9) as id, 1 as val1, null::integer as val2;
create table my_table2 as
select generate_series(0,9) as id, 1 as val1, null::integer as val2, 3 as val3;
ফাংশন:
create function has_nonnulls(p_schema in text, p_table in text, p_column in text)
returns boolean language plpgsql as $$
declare
b boolean;
begin
execute 'select exists(select * from '||
p_table||' where '||p_column||' is not null)' into b;
return b;
end;$$;
প্রশ্ন:
select table_schema, table_name, column_name,
has_nonnulls(table_schema, table_name, column_name)
from information_schema.columns
where table_schema='stack';
ফলাফল:
table_schema | table_name | column_name | has_nonnulls
--------------+------------+-------------+--------------
stack | my_table | id | t
stack | my_table | val1 | t
stack | my_table | val2 | f
stack | my_table2 | id | t
stack | my_table2 | val1 | t
stack | my_table2 | val2 | f
stack | my_table2 | val3 | t
(7 rows)
এছাড়াও আপনি ক্যাটালগটি জিজ্ঞাসা করে একটি আনুমানিক উত্তর পেতে পারেন - যদি null_frac
শূন্য হয় যা কোনও নাল নির্দেশ করে না তবে 'বাস্তব' ডেটার বিরুদ্ধে ডাবল-চেক করা উচিত:
select tablename, attname, null_frac from pg_stats where schemaname='stack';
tablename | attname | null_frac
-----------+---------+-----------
my_table | id | 0
my_table | val1 | 0
my_table | val2 | 1
my_table2 | id | 0
my_table2 | val1 | 0
my_table2 | val2 | 1
my_table2 | val3 | 0
(7 rows)
pg_stats
টেবিল তৈরির সময় শূন্য থাকলে ফাঁকা স্থানিক কলামগুলি উপস্থিত হবে না । কিছু গৃহকর্ম করার সময় আমি আজ এটি খুঁজে পেয়েছি। আমি আবিষ্কার করেছি যে কয়েকটি historical তিহাসিক আশাবাদী টেবিলগুলি ব্যবহার করে আমদানি করা হয়েছিল ogr2ogr
। যদি ডেটা আমদানি হচ্ছে তে কোনও স্থানিক কলাম না থাকে, ogr2ogr
পূর্ণ জ্যামিতি কলাম তৈরি করে <NULL>
। pg_stats
আমদানিকৃত আশা টেবিলগুলি থেকে আমার কোনও জ্যামিতি কলাম নেই (এটিতে এই টেবিলগুলির জন্য অন্যান্য সমস্ত কলাম রয়েছে)। বেশ বিজোড়, আমি ভেবেছিলাম।
পোস্টগ্র্যাস্কল-এ, আপনি সরাসরি পরিসংখ্যান থেকে ডেটা পেতে পারেন:
vacuum analyze; -- if needed
select schemaname, tablename, attname
from pg_stats
where most_common_vals is null
and most_common_freqs is null
and histogram_bounds is null
and correlation is null
and null_frac = 1;
আপনি কয়েকটি ভ্রান্ত ইতিবাচক পেতে পারেন, সুতরাং প্রার্থীদের সন্ধানের পরে পুনরায় পরীক্ষা করা হবে।
null_frac=1
?
আমি এসকিউএল সার্ভার ২০০৮-এর জন্য কাজ করে টি-এসকিউএল-এ আমার সমাধানটি দেখাব Post আমি পোস্টগ্র্রেএসকিউএল এর সাথে পরিচিত নই, তবে আমি আশা করি আপনি আমার সমাধানে কিছু গাইডেন্স পাবেন।
-- create test table
IF object_id ('dbo.TestTable') is not null
DROP table testTable
go
create table testTable (
id int identity primary key clustered,
nullColumn varchar(100) NULL,
notNullColumn varchar(100) not null,
combinedColumn varchar(100) NULL,
testTime datetime default getdate()
);
go
-- insert test data:
INSERT INTO testTable(nullColumn, notNullColumn, combinedColumn)
SELECT NULL, 'Test', 'Combination'
from sys.objects
union all
SELECT NULL, 'Test2', NULL
from sys.objects
select *
from testTable
-- FIXED SCRIPT FOR KNOWN TABLE (known structure) - find all completely NULL columns
select sum(datalength(id)) as SumColLength,
'id' as ColumnName
from dbo.testTable
UNION ALL
select sum(datalength(nullColumn)) as SumColLength,
'nullColumn' as ColumnName
from dbo.testTable
UNION ALL
select sum(datalength(notNullColumn)) as SumColLength,
'notNullColumn' as ColumnName
from dbo.testTable
UNION ALL
select sum(datalength(combinedColumn)) as SumColLength,
'combinedColumn' as ColumnName
from dbo.testTable
UNION ALL
select sum(datalength(testTime)) as SumColLength,
'testTime' as ColumnName
from dbo.testTable
-- DYNAMIC SCRIPT (unknown structure) - find all completely NULL columns
declare @sql varchar(max) = '', @tableName sysname = 'testTable';
SELECT @sql +=
'select sum(datalength(' + c.COLUMN_NAME + ')) as SumColLength,
''' + c.COLUMN_NAME + ''' as ColumnName
from ' + c.TABLE_SCHEMA + '.' + c.TABLE_NAME --as StatementToExecute
+ '
UNION ALL
'
FROM INFORMATION_SCHEMA.COLUMNS c
WHERE c.TABLE_NAME = @tableName;
SET @sql = left(@sql, len(@sql)-11)
print @sql;
exec (@sql);
সংক্ষেপে, আমি যা করেছি তা হ'ল 5 টি কলাম, আইডি এবং টেস্টটাইম সনাক্তকরণ এবং গেটডেট () ফাংশন দ্বারা উত্পন্ন হওয়ার সাথে একটি টেস্ট টেবিল তৈরি করা হয়েছিল, যখন 3 বারচার কলামগুলি আগ্রহের বিষয়। একটির কেবলমাত্র NULL মান থাকবে, একটির কোনও NULL থাকবে না, অন্যটির সংযুক্ত কলাম হবে। স্ক্রিপ্টের চূড়ান্ত ফলাফলটি হ'ল স্ক্রিপ্টটি সমস্ত সারি NULL থাকার হিসাবে কলামটি নাল কলামটি প্রতিবেদন করবে।
ধারণাটি ছিল ডিটাএলএনজিটিএইচ ফাংশনটি গণনা করাপ্রতিটি কলামের জন্য (প্রদত্ত অভিব্যক্তির জন্য বাইটের সংখ্যা গণনা করে)। সুতরাং আমি প্রতিটি কলামের প্রতিটি সারিটির জন্য DATLENGTH মান গণনা করেছি এবং প্রতি কলামে একটি SUM তৈরি করেছি। যদি প্রতি কলামে SUM টি NULL হয় তবে সম্পূর্ণ কলামে নুল সারি থাকে, নাহলে কিছু তথ্য ভিতরে থাকে।
এখন আপনার পোস্টগ্র্রেএসকিউএল এর জন্য অনুবাদটি খুঁজে পেতে হবে এবং আশা করি কোনও সহকর্মী আপনাকে এটিতে সহায়তা করতে সক্ষম হবে। অথবা সম্ভবত একটি দুর্দান্ত সিস্টেম ভিউ রয়েছে যা দেখিয়ে দেবে যে চাকাটি পুনঃসংশ্লিষ্ট করার জন্য আমি কতটা বোবা :-)।
এই জাতীয় তথ্যের জন্য আপনাকে তথ্য ক্যাটালগটি জিজ্ঞাসা করতে হবে:
SELECT column_name FROM information_schema.columns WHERE table_name='your_table'
আপনাকে আপনার কলামগুলির সাথে মিলবে সারণী দেয়।
আমার কাছে বর্তমানে পোস্টগ্রিজ ইনস্টলেশন নেই তবে বাকীটি সহজ হওয়া উচিত
loop over the results of the above query and foreach result
send a COUNT(*) to the table
if the count is null, give back the column,
else ignore it
end foreach
বিভিন্ন সংস্থান থেকে একত্রিত করার পরে, আমি এই ফাংশনটি নিয়ে এসেছি এবং সমস্ত ডাটাবেস সারণীতে সমস্ত খালি কলামগুলি সন্ধান করতে জিজ্ঞাসা করেছি
CREATE OR REPLACE FUNCTION public.isEmptyColumn(IN table_name varchar, IN column_name varchar)
RETURNS boolean AS $$
declare
count integer;
BEGIN
execute FORMAT('SELECT COUNT(*) from %s WHERE %s IS NOT NULL', table_name, quote_ident(column_name)) into count;
RETURN (count = 0);
END; $$
LANGUAGE PLPGSQL;
SELECT s.table_name, s.column_name
FROM information_schema.columns s
WHERE (s.table_schema LIKE 'public') AND
(s.table_name NOT LIKE 'pg_%') AND
(public.isEmptyColumn(s.table_name, s.column_name))
উপভোগ করুন :)