2011-03-17 49 views
26

Tôi đã gán một bảng cho mỗi bảng để đếm các cột không có giá trị. Dễ dàng:Tìm các cột KHÔNG NULL trong PostgreSQL

SELECT table_name, count(*) FROM INFORMATION_SCHEMA.COLUMNS 
WHERE is_nullable='NO' 
GROUP BY table_name; 


Bây giờ tôi phải thay đổi này để đếm "cột có tài sản 'NOT NULL'". Đoạn mã sau sẽ làm điều này hay nó sẽ chỉ kiểm tra tên cột thời tiết không phải là null?

CREATE TEMP TABLE A AS 
SELECT DISTINCT column_name, table_name AS name FROM INFORMATION_SCHEMA.COLUMNS 
WHERE column_name IS NOT NULL 
GROUP BY table_name, column_name; 

SELECT name, count(*) FROM A 
GROUP BY name; 

Nếu không ... Mọi lời khuyên?

+0

Tôi nghĩ câu hỏi đặt ra là liệu cột có được đặt NOT NULL một cách rõ ràng hoặc nếu đó là khóa chính (không bao giờ có thể rỗng). Nếu vậy, có vẻ như COLUMNS không có thông tin đó. Có thể phải tìm kiếm thông qua cột def trong pg_attrdef cho NOT NULL. Nếu không, nó chỉ là restating truy vấn đầu tiên của bạn. –

+0

Dường như COLUMNS có thông tin đó cho tôi. Khai báo một cột hoặc là 'NOT NULL PRIMARY KEY' hoặc đơn giản là' PRIMARY KEY' sets không thể 'NO'. Các cột được khai báo một cách rõ ràng NULL và các tập NULL được khai báo ngầm định là không thể trả về là 'CÓ'. –

Trả lời

30

số

Truy vấn này

SELECT DISTINCT column_name, table_name 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE column_name IS NOT NULL 

sẽ trả lại tất cả các hàng có giá trị trong cột "column_name".

Tất cả các hàng trong bảng đó sẽ luôn có giá trị trong cột "column_name".

Bạn chỉ cần biết có bao nhiêu cột không có giá trị và có bao nhiêu cột không thể vô hiệu?

SELECT is_nullable, COUNT(*) 
FROM INFORMATION_SCHEMA.COLUMNS 
GROUP BY is_nullable; 

Đếm theo tên bảng? Tôi nghĩ bạn có thể sử dụng nó.

SELECT table_name, is_nullable, count(*) 
FROM INFORMATION_SCHEMA.COLUMNS 
GROUP BY table_name, is_nullable 
ORDER BY table_name, is_nullable; 
Các vấn đề liên quan