2009-04-23 34 views
5

Làm cách nào để chọn một số cột trong bảng chỉ chứa giá trị NULL cho tất cả các hàng? Giả sử nếu Bảng có 100 cột, trong số 100 cột này, 60 cột có giá trị null. Làm thế nào tôi có thể viết nơi điều kiện để kiểm tra xem 60 cột là null.Truy vấn SQL để kiểm tra xem 40 cột trong bảng có rỗng không

+0

python, C# và ruby? Bạn có thể giúp đỡ bằng cách cung cấp cơ sở dữ liệu bạn đang sử dụng không? – Damovisa

+0

Bạn có nghĩa là nơi các cột này là null cho tất cả các hàng? 40 hay 60? Cơ sở dữ liệu nào? –

+0

Tôi không hiểu câu hỏi. Bạn muốn biết cho một cột nhất định nếu có ít nhất một giá trị null trong tất cả các hàng? Hoặc nếu tất cả các giá trị là null? Hay bạn nhầm lẫn các hàng với các cột? –

Trả lời

7
where c1 is null and c2 is null ... and c60 is null 

phím tắt sử dụng string concatenation (Oracle cú pháp):

where c1||c2||c3 ... c59||c60 is null 
+0

Đó là bit cuối cùng không may dựa trên braindead Oracle không có khả năng nói sự khác biệt giữa một chuỗi rỗng và NULL. Nó không phải là một giải pháp tốt. – paxdiablo

+0

Nhưng tôi sẽ bỏ phiếu cho bạn khi bit đầu tiên là đúng cách để làm điều đó, không có khả năng tái cấu trúc bảng DB. – paxdiablo

+1

Nếu máy chủ SQL của nó, có thể sử dụng kết hợp ... – Naren

16

có thể với một liên hiệp

SELECT * FROM table WHERE coalesce(col1, col2, col3, ..., colN) IS NULL 
+0

Nếu có bất kỳ cơ hội nào để sử dụng chỉ mục trên bất kỳ trường nào trong số này, bạn đã giết nó bằng cách đặt một hàm quanh nó. – dkretz

+0

Vâng, chức năng mỗi hàng là một kẻ giết người thực hiện trên bất kỳ bảng có kích thước nào. – paxdiablo

+0

coalesce chỉ hoạt động khi tất cả các cột có kiểu dữ liệu tương thích (ít nhất trong Oracle nó không hoạt động cho một kết hợp của số, ngày và cột VARCHAR) –

0

Nó sẽ giúp để biết được db bạn đang sử dụng và có lẽ đó ngôn ngữ hoặc db framework nếu sử dụng một.

Điều này sẽ hoạt động mặc dù trên bất kỳ cơ sở dữ liệu nào.

Một cái gì đó như thế này có lẽ sẽ là một thủ tục được lưu trữ tốt, vì không có tham số đầu vào cho nó.

select count(*) from table where col1 is null or col2 is null ... 
1

bạn đang cố gắng tìm hiểu xem một tập hợp cụ thể của 60 cột là null, hoặc làm bạn chỉ muốn tìm hiểu nếu có 60 trong số 100 cột là null (không nhất thiết phải giống nhau 60 cho mỗi hàng ?)

Nếu đó là sau này, một cách để làm điều đó trong oracle sẽ được sử dụng chức năng nvl2, như vậy:

select ... where (nvl2(col1,0,1)+nvl2(col2,0,1)+...+nvl2(col100,0,1) > 59) 

một thử nghiệm nhanh của ý tưởng này:

select 'dummy' from dual where nvl2('somevalue',0,1) + nvl2(null,0,1) > 1 

Returns 0 hàng trong khi:

select 'dummy' from dual where nvl2(null,0,1) + nvl2(null,0,1) > 1 

Returns 1 hàng như mong đợi kể từ hơn một trong các cột là null.

1

Trước hết, nếu bạn có bảng có nhiều giá trị rỗng và bạn sử dụng SQL Server 2008 - bạn có thể muốn xác định bảng sử dụng cột thưa thớt (http://msdn.microsoft.com/en-us/library/cc280604.aspx). Thứ hai, tôi không chắc chắn liệu coalesce có giải quyết được câu hỏi hay không - có vẻ như Ammu thực sự muốn tìm danh sách các cột không có giá trị cho tất cả các hàng, nhưng tôi có thể đã hiểu lầm. Tuy nhiên - đó là một câu hỏi thú vị, vì vậy tôi đã viết một thủ tục để liệt kê các cột null cho bất kỳ bảng đưa ra:

IF (OBJECT_ID(N'PrintNullColumns') IS NOT NULL) 
    DROP PROC dbo.PrintNullColumns; 
go 
CREATE PROC dbo.PrintNullColumns(@tablename sysname) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @query nvarchar(max); 
    DECLARE @column sysname; 
    DECLARE columns_cursor CURSOR FOR 
     SELECT c.name 
     FROM sys.tables t JOIN sys.columns c ON t.object_id = c.object_id 
     WHERE t.name = @tablename AND c.is_nullable = 1; 
    OPEN columns_cursor; 
    FETCH NEXT FROM columns_cursor INTO @column; 
    WHILE (@@FETCH_STATUS = 0) 
    BEGIN 
     SET @query = N' 
     DECLARE @c int 
     SELECT @c = COUNT(*) FROM ' + @tablename + ' WHERE ' + @column + N' IS NOT NULL 
     IF (@c = 0) 
      PRINT (''' + @column + N''');' 
     EXEC (@query); 

     FETCH NEXT FROM columns_cursor INTO @column; 
    END 
    CLOSE columns_cursor; 
    DEALLOCATE columns_cursor; 
    SET NOCOUNT OFF; 
    RETURN; 
END; 
go 
0

Dưới đây là một phương pháp mà dường như với tôi để được logic cũng như (sử dụng Netezza hoặc TSQL)

SELECT KeyColumn, MAX(NVL2(TEST_COLUMN,1,0) AS TEST_COLUMN 
    FROM TABLE1 
GROUP BY KeyColumn 

Vì vậy, mỗi TEST_COLUMN có giá trị MAX là 0 có cột chứa tất cả các giá trị rỗng cho tập bản ghi. Hàm NVL2 đang nói nếu dữ liệu cột không trả về giá trị 1, nhưng nếu nó là null thì trả về 0.

Lấy MAX của cột đó sẽ tiết lộ nếu có hàng nào không rỗng. Giá trị 1 có nghĩa là có ít nhất 1 hàng có dữ liệu. Zero (0) có nghĩa là mỗi hàng là null.

Các vấn đề liên quan