SQL заменяет все NULL - PullRequest
       1

SQL заменяет все NULL

10 голосов
/ 28 октября 2011

У меня есть большая таблица с несколькими пустыми значениями.Какой самый простой способ выбрать из таблицы нули вместо NULL.

Или, если нет простого способа сделать это, я готов физически заменить все нули на нули в таблице.

Есть много столбцов, я не хочу проходить через каждый из них с чем-то вроде ISNULL (FieldName, 0) AS FieldName.

Ответы [ 9 ]

16 голосов
/ 28 октября 2011

Как уже говорили многие, лучшим подходом является ISNULL (), однако, если вы хотите простой способ генерировать все эти ISNULL (), используйте следующий код:

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'

Это значительно упростит утомительную работу, вам просто нужно отредактировать вывод для учета различных типов полей (int, varchar, даты и т. Д.)

Редактировать: учет различных типов данных со значениями по умолчанию.

8 голосов
/ 28 октября 2011

На самом деле у вас есть два варианта

ISNULL(yourColumn,0) AS columnName

или для фактического решения проблемы и изменения всех данных NULL на 0

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

Когда вы делаете это, не забывайте ГДЕ или всев конечном итоге будет 0!

3 голосов
/ 28 октября 2011

Необходимо вручную указать каждый столбец в операторе SELECT и использовать функцию ISNULL () :

SELECT ISNULL(columnName, 0), ... yes all of them
1 голос
/ 08 мая 2013

Будь боссом. Напишите что-то вроде:

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

Он выдаст вам большой старый запрос.

1 голос
/ 28 октября 2011

Несмотря на ваше нежелание сделать это,

ISNULL(FieldName,0) AS FieldName

для каждого столбца - правильный способ справиться с этим.

0 голосов
/ 28 мая 2015

Я хотел, чтобы динамический запрос выполнял опцию обновления. Заимствование из поста выше и другой У меня есть следующее:

            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
0 голосов
/ 31 октября 2011

Я не хочу, чтобы каждый из них проходил с чем-то вроде ISNULL (FieldName, 0).

Возьмите удар и сделайте это один раз для каждого:

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

Затем вы можете забыть все о ISNULL, COALESCE, трехзначной логике и т. Д.

0 голосов
/ 28 октября 2011

Нелегко сделать это, не пройдя каждый столбец, как вы сказали.

NULL имеет особое и отличное значение 0. Это означает, что нет значения или неизвестно, в отличие от известного нулевого значения. Некоторые пуристы базы данных утверждают, что в строке таблицы вообще не должно быть NULL!

Если значения NULL в исходной таблице действительно означают ноль, измените их, в противном случае имейте дело с нулями, поскольку они распространяются через ваши запросы.

0 голосов
/ 28 октября 2011

В качестве альтернативы ISNULL, вы можете использовать COALESCE, который совместим с ANSI SQL.

select coalesce(yourcolumn, 0)

Есть много столбцов, которые я не хочу проходитькаждый с чем-то вроде ISNULL (FieldName, 0) AS FieldName.

Не всегда можно получить то, что вы хотите.Очень плохо.Это путь: столбец за столбцом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...