SQL замінити всі NULL

У мене є великий стіл з деякими NULL в ньому. Який найпростіший спосіб вибрати з таблиці замість 0, а не NULL.

Або якщо немає простого способу зробити це, я готовий фізично замінити всі нульові числа на 0 в таблиці.

Існує безліч стовпчиків, я не хочу, щоб вони мали пройти через кожен із чимось на зразок ISNULL (FieldName, 0) AS FieldName.

8

9 Відповіді

Як багато хто тут говорив, кращим підходом є 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, dates та ін).

Редагувати: облік різних типів даних із значеннями за замовчуванням ..

15
додано
Також слід розглянути тип стовпця, оскільки числовий код 0 не є дійсним значенням заміщення для всіх типів стовпчиків
додано Автор sll, джерело
+1 тепер виглядає краще. Хороша ідея дійсно
додано Автор sll, джерело
Оновлено для розміщення;) звичайно я міг би пропустити тип .. але це дійсно залежить від того, що він все використовує ..
додано Автор Josh Weatherly, джерело
Я просто збираюся написати функцію для створення правильного запиту, але якщо це працює, це, мабуть, найкраще рішення.
додано Автор Alec, джерело

Ви дійсно маєте два варіанти

ISNULL(yourColumn,0) AS columnName

або щоб фактично виправити проблему і змінити всі NULL дані на 0

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

Коли ви робите це, не забудьте про те, що ДЕ, або все стане 0!

5
додано
Дякуємо за нагадування про те, де. Був там зробив те!
додано Автор Lill Lansey, джерело
Це друге рішення є розумним; здивований - не більше +1.
додано Автор Matt O'Brien, джерело

Ви повинні вручну вказати кожен стовпець у виписці SELECT і використовувати ISNULL() функція:

SELECT ISNULL(columnName, 0), ... yes all of them
3
додано
@Alec "Простішим" рішенням було б позначити стовпці як NOT NULL DEFAULT 0 , коли таблиця вперше була створена.
додано Автор Joe Stefanelli, джерело
@ webturner: іноді ми повинні робити те, що нам не подобається ....
додано Автор sll, джерело
Це саме те, що він сказав, що не хоче робити!
додано Автор Stephen Turner, джерело
@sll: Або навчитися любити те, що ми повинні робити ;-) Нуль у даних має окреме значення до нуля.
додано Автор Stephen Turner, джерело
Так, я вже розглядав це рішення, як я вже згадував. Я дійсно здивований людям не публікую моє запитання частіше. Схоже, що було б просте рішення.
додано Автор Alec, джерело

Незважаючи на вашу небажаність робити це,

ISNULL(FieldName,0) AS FieldName

для кожного стовпця є правильний спосіб це вирішити.

1
додано

Будь боссом. Напиши щось на зразок:

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

Це виплекає великий запит для вас.

1
додано

Крім того, для ISNULL можна використовувати COALESCE , що сумісний з ANSI SQL.

select coalesce(yourcolumn, 0)

Є багато стовпчиків, я не хочу, щоб вони мали пройти через кожен з чимось на зразок ISNULL (FieldName, 0) AS FieldName.

Ви не завжди можете отримати те, що ви хочете. Дуже погано Це спосіб перейти: колонка за стовпцем.

0
додано

Я не хочу, щоб я мав пройти через кожен з чимось на зразок ISNULL (FieldName, 0) AS FieldName.

Візьміть удар і виконайте це один раз для кожного з них:

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

Тоді ви можете забути про ISNULL , COALESCE , тризначній логіці тощо.

0
додано

Це легко зробити, не проходячи кожен стовпець, як ви сказали.

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

Якщо значення NULL у вашому таблиці джерела дійсно означають нуль, то змініть їх, в іншому випадку розглядайте нулі, як вони розповсюджуються через ваші запитання.

0
додано

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

            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
додано