2011-10-28 40 views
7

Tôi có một bảng lớn với một số NULL trong đó. Cách dễ nhất có thể để chọn từ bảng với 0 thay vì NULL.SQL thay thế tất cả các số NULL

Hoặc nếu không có cách dễ dàng để làm điều đó, tôi sẵn sàng thay thế tất cả các giá trị bằng 0 trong bảng.

Có nhiều cột, tôi không muốn phải đi qua từng cột với cái gì đó như ISNULL (Tên trường, 0) AS FieldName.

Trả lời

14

Như nhiều người ở đây đã nói, phương pháp tốt nhất là ISNULL(), tuy nhiên nếu bạn muốn một cách dễ dàng để tạo ra tất cả những ISNULL() 's sử dụng đoạn mã sau:

SELECT 'ISNULL([' + COLUMN_NAME + '], ' + 
    CASE 
    WHEN DATA_TYPE = 'bit' THEN '0' 
    WHEN DATA_TYPE = 'int' THEN '0' 
    WHEN DATA_TYPE = 'decimal' THEN '0' 
    WHEN DATA_TYPE = 'date' THEN '''1/1/1900''' 
    WHEN DATA_TYPE = 'datetime' THEN '''1/1/1900''' 
    WHEN DATA_TYPE = 'uniqueidentifier' THEN '00000000-0000-0000-0000-000000000000' 
    ELSE '''''' -- everything else get's an empty string 
    END + ') AS [' + COLUMN_NAME + '],' 
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'TableName' 

này sẽ làm cho công việc tẻ nhạt một tổng thể dễ dàng hơn nhiều, sau đó bạn chỉ phải chỉnh sửa đầu ra để giải thích cho các loại trường (int, varchar, ngày tháng, vv)

Edit: chiếm kiểu dữ liệu khác nhau với giá trị mặc định ..

+0

Ngoài ra bạn phải xem xét kiểu cột vì số '0' không phải là giá trị thay thế hợp lệ cho tất cả các loại cột – sll

+0

Cập nhật để phù hợp;) tất nhiên tôi có thể đã bỏ lỡ một loại .. nhưng điều đó thực sự phụ thuộc vào những gì anh ấy đang sử dụng .. –

+0

Tôi sẽ viết một hàm để xây dựng truy vấn đúng, nhưng nếu nó hoạt động, đó có lẽ là giải pháp tốt nhất. – Alec

3

Bạn phải tự xác định mỗi cột trong câu lệnh SELECT và sử dụng ISNULL() chức năng:

SELECT ISNULL(columnName, 0), ... yes all of them 
+2

Đó chính xác là những gì anh ấy nói anh ấy không muốn làm! –

+2

@webturner: đôi khi chúng ta phải làm những gì chúng ta không thích .... – sll

+0

yeah Tôi đã xem xét giải pháp này như tôi đã đề cập. Tôi thực sự ngạc nhiên mọi người không đăng câu hỏi của tôi thường xuyên hơn. Có vẻ như sẽ có một giải pháp đơn giản hơn. – Alec

1

Mặc dù miễn cưỡng của mình để làm như vậy,

ISNULL(FieldName,0) AS FieldName 

cho mỗi cột là cách chính xác để xử lý này .

4

Bạn có hai lựa chọn thực sự

ISNULL(yourColumn,0) AS columnName 

hoặc để thực sự khắc phục vấn đề và thay đổi tất cả các dữ liệu NULL để 0

UPDATE table 
SET column = 0 
WHERE 
column IS NULL -- remember "column = NULL" always equates to NULL! 

Khi bạn dont này quên WHERE hoặc tất cả mọi thứ sẽ kết thúc là 0!

+1

Giải pháp thứ hai này là hợp lý; ngạc nhiên là không có nhiều +1. –

+0

Cảm ơn bạn đã nhắc nhở về địa điểm. Đã từng trải qua rồi! –

0

Hoặc đến ISNULL, bạn có thể sử dụng COALESCE, tương thích với ANSI SQL.

select coalesce(yourcolumn, 0) 

Có rất nhiều cột, tôi không muốn phải đi qua mỗi một với một cái gì đó giống như ISNULL (FieldName, 0) AS FieldName.

Bạn không thể luôn có được những gì bạn muốn. Quá tệ. Đây là con đường để đi: cột theo cột.

0

Nó không phải dễ dàng để làm điều đó mà không đi qua mỗi cột chỉ như bạn đã nói.

NULL có ý nghĩa đặc biệt và khác biệt với 0. Điều đó có nghĩa là không có giá trị hoặc không xác định trái với giá trị 0 đã biết. Một số người thuần túy cơ sở dữ liệu sẽ cho rằng một hàng trong một bảng không nên có NULL ở tất cả!

Nếu các NULL trong bảng nguồn thực sự có nghĩa là không thì hãy thay đổi chúng, nếu không thì sẽ xử lý các giá trị rỗng khi chúng thúc đẩy thông qua các truy vấn của bạn.

0

Tôi không muốn phải trải qua từng cái với cái gì đó như ISNULL (Tên trường, 0) AS FieldName.

Lấy hit và làm này một lần cho mỗi người:

ALTER TABLE TableName ALTER COLUMN FieldName INTEGER DEFAULT 0 NOT NULL; 

Sau đó, bạn có thể quên tất cả về ISNULL, COALESCE, logic ba giá trị, vv

0

Hãy là một ông chủ . Viết một cái gì đó như:

select 'update ' + table_name + ' set [' + column_name + '] = '''' where [' + column_name + '] is null' 
from tempdb.information_schema.columns 
where table_name = 'YourTableName' 

Nó sẽ tạo ra một truy vấn lớn 'cho bạn.

0

Tôi muốn có truy vấn động để thực hiện tùy chọn cập nhật. Vay từ bài đăng ở trên và another Tôi có như sau:

  USE [YOUR DATABASE] 
      DECLARE @tableName nvarchar(100) 
      DECLARE @name varchar(50) 
      DECLARE @dtype varchar(50) 
      DECLARE @CMD NVARCHAR (200) 

      SET @tableName = [YOUR TABLE NAME] 


      DECLARE db_cursor CURSOR FOR 

        SELECT c.name, t.name AS Dtype 
        FROM sys.columns c 
        INNER JOIN sys.types t 
        ON t.system_type_id = c.system_type_id 
        WHERE c.[object_id] = 
         (SELECT [object_id] FROM sys.objects WHERE type = 'U' AND [NAME] = @tableName) 

      OPEN db_cursor 
      FETCH NEXT FROM db_cursor INTO @name, @Dtype 

      WHILE @@FETCH_STATUS = 0 BEGIN 

      SET @CMD = 'UPDATE ' + @tableName + ' SET ' + quotename(@name) +' = ' + 

       (CASE 
       WHEN (@Dtype = 'bit') THEN '0' 
       WHEN (@Dtype = 'int') THEN '0' 
       WHEN (@Dtype = 'decimal') THEN '0' 
       WHEN (@Dtype = 'date') THEN '''1/1/1900''' 
       WHEN (@Dtype = 'datetime') THEN '''1/1/1900''' 
       WHEN (@Dtype = 'uniqueidentifier') THEN '00000000-0000-0000-0000-000000000000' 
       ELSE '''''' 
       END) 
      + ' WHERE ' + quotename(@name) +' IS NULL' 

      PRINT @CMD 

      EXEC sp_executeSQL @cmd 

      FETCH NEXT FROM db_cursor INTO @name, @Dtype 

      END 

      CLOSE db_cursor 
      DEALLOCATE db_cursor 
Các vấn đề liên quan