2016-03-02 98 views
0

我有一個300列以上的表格,其中許多列中沒有數據。有沒有一個查詢我可以用來找出這些列的名稱,所以我可以刪除他們的表。另外我使用的是紅移服務器上的PostgreSQL數據庫,如果該事項在表格中搜索所有列

回答

0

首先創建一個DINAMIC查詢你

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

然後使用一個循環中的字段名

SELECT count(*) 
FROM 'your_schema'.'your_schema' 
WHERE `yourfield` IS NOT NULL 
HAVING count(*) = 0 

Using a cursor with dynamic SQL in a stored procedure

+0

我站在第一部分,並已這樣做,動態查詢是我卡住了。我不知道在第一步之後要做什麼,'yourfield'來自何處? – jhnvarun

+0

你創建一個遊標,爲遊標循環,建立一個字符串'strSQL'與你想要的查詢和'執行strSQL'我包括與示例的鏈接 –

+0

好吧,所以我是sry,但它仍然沒有意義給我,你能否把腳本寫在一個頁面上,而不是提供其他問題的鏈接? – jhnvarun

0

您可以嘗試使用jsonb typefunctions

比方說,你的表聲明爲

create table t as (x int, y varchar, z numeric); 

首先讓轉換表的行jsonb。這很簡單:

select to_jsonb(t.*) from t; 

結果(測試數據)

  to_jsonb   
-------------------------- 
{"x":1,"y":"a","z":null} 
{"x":2,"y":"b","z":null} 

下一步,我們將這些結果轉化爲行像(鍵,值)使用另一個JSON功能:

select jsonb_each(to_jsonb(t.*)) from t; 

結果:

jsonb_each 
------------- 
(x,1) 
(y,"""a""") 
(z,null) 
(x,2) 
(y,"""b""") 
(z,null) 

它是almos我們需要什麼。下一步:

select (w).key, (w).value from (select jsonb_each(to_jsonb(t.*)) as w from t) tt; 

結果

key | value 
-----+------- 
x | 1 
y | "a" 
z | null 
x | 2 
y | "b" 
z | null 

這裏我們使用(w)指定它是現場的,而不是表。

而最後大步:

select 
    (w).key 
from 
    (select jsonb_each(to_jsonb(t.*)) as w from t) tt 
group by 
    (w).key 
having 
    count(*) filter (where((w).value != 'null')) = 0; 

結果

key 
----- 
z 

嘗試使用剛剛更換t你的表名的最後一個查詢。


UPD:

您也可以嘗試使用PostgreSQL的統計信息:

analyse yourtable; 

select 
    pg_class.relname, 
    pg_attribute.attname, 
    pg_statistic.stanullfrac 
from 
    pg_class join 
    pg_statistic on (pg_class.oid = pg_statistic.starelid) join 
     pg_attribute on (pg_class.oid = pg_attribute.attrelid and pg_statistic.staattnum = pg_attribute.attnum) 
where 
    pg_class.relname = 'yourtable'; 

stanullfrac欄,你會看到空的相對量爲每個表的列1意味着所有完全無效(但我不知道它是如何準確的)