SQL barcha NULLlarni o'zgartiradi

Menda ba'zi NULLlar bilan katta stol bor. 0 dan NULLlar o'rniga stoldan tanlashning eng oson usuli qanday?

Yoki buni qilishning oson usuli bo'lmasa, jadvaldagi barcha nulllarni jismonan almashtirishga tayyorman.

Ko'p sonli ustun bor, har birini ISNULL (FieldName, 0) kabi FieldName bilan almashtirishni hohlamayman.

8

9 javoblar

Bu erda ko'plar aytganlaridek, eng yaxshi yondashuv ISNULL() dir, ammo barcha ISNULL() larni yaratishning oson usulini istasangiz quyidagi kodni ishlating:

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'

Bu zerikarli ishni ancha osonlashtiradi, keyin siz faqat turli xil maydon turlariga (int, varchar, sanalar, va hokazo) chiqishni tahrir qilishingiz kerak bo'ladi.

Tartibga solish: standart ma'lumotlarga ega bo'lgan turli ma'lumotlar turlarini hisoblash.

15
qo'shib qo'ydi
Bundan tashqari, sütun turini ko'rib chiqishingiz kerak, chunki raqamli 0 barcha ustun turlari uchun joriy almashtirish qiymati emas
qo'shib qo'ydi muallif sll, manba
+1 Endi yaxshi ko'rinadi. Albatta, yaxshi fikr
qo'shib qo'ydi muallif sll, manba
Menga javob berish uchun yangilangan;) Albatta, men bir turni o'tkazib yuborgan bo'lardim ... lekin bu, albatta, u nima bilan shug'ullanayotganiga bog'liq.
qo'shib qo'ydi muallif Josh Weatherly, manba
Men faqat to'g'ri so'rovni yaratish funktsiyasini yozmoqchiman, lekin agar bu ishlayotgan bo'lsa, bu eng yaxshi echim.
qo'shib qo'ydi muallif Alec, manba

Sizda ikkita variant mavjud

ISNULL(yourColumn,0) AS columnName

yoki aslida muammoni bartaraf etish va barcha NULL ma'lumotlarini 0 ga o'zgartirish uchun

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

Buni qilganda QAChONni unutmang, yoki har bir narsa 0 bo'ladi!

5
qo'shib qo'ydi
Qayerda ekanligini eslatganingiz uchun tashakkur. U erda shunday qildim!
qo'shib qo'ydi muallif Lill Lansey, manba
Ushbu ikkinchi yechim oqilona; + 1s ortiq emasligi uchun hayron bo'lishdi.
qo'shib qo'ydi muallif Matt O'Brien, manba

SELECT iborasida har bir ustunni qo'lda ko'rsatib, ISNULL() dan foydalaning. funktsiyasi:

SELECT ISNULL(columnName, 0), ... yes all of them
3
qo'shib qo'ydi
@Alec "oddiy" yechim jadvalni birinchi marta yaratilganida NOT NULL DEFAULT 0 deb belgilash edi.
qo'shib qo'ydi muallif Joe Stefanelli, manba
@webturner: ba'zan biz yoqtirmagan narsani qilishimiz kerak.
qo'shib qo'ydi muallif sll, manba
Mana, u buni istamasligini aytdi!
qo'shib qo'ydi muallif Stephen Turner, manba
@sll: Yoki nima qilishimiz kerakligini bilib olamiz ;-) Ma'lumotlarda bo'shlik nolga alohida ma'noga ega.
qo'shib qo'ydi muallif Stephen Turner, manba
Ha, men ushbu echimni men eslatganimdek ko'rib chiqdim. Men, albatta, men savolni tez-tez joylashtirmayotganiga hayronman. Ko'rinib turibdiki, oddiy echim bo'lar edi.
qo'shib qo'ydi muallif Alec, manba

Buning oldini olishingizga qaramasdan,

ISNULL(FieldName,0) AS FieldName

har bir ustun uchun bu to'g'ri yo'l.

1
qo'shib qo'ydi

Xo'jayin bo'ling. Quyidagi kabi yozing:

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

Siz uchun katta ol so'rovini tupuradi.

1
qo'shib qo'ydi

Shu bilan bir qatorda ISNULL uchun ANSI SQL mos keluvchi COALESCE dan foydalanishingiz mumkin.

select coalesce(yourcolumn, 0)

Ko'p sonli ustun bor, har bir kishi orqali FieldName nomi bilan ISNULL (FieldName, 0) kabi narsalar bilan o'tishni xohlamayman.

Siz xohlagan narsani har doim ham ololmaysiz. Juda yomon. Bu o'tish usulidir: ustun ustunidan.

0
qo'shib qo'ydi

Har bir kishini FieldName sifatida ISNULL (FieldName, 0) kabi narsalar bilan o'tishni xohlamayman.

Hitni oling va har biri uchun bir marta bajaring :

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

Keyin ISNULL , COALESCE , uchta qimmatli mantiq va h.k.

0
qo'shib qo'ydi

Siz aytganidek, har bir ustunni bosib o'tmasdan qilish oson emas.

NULL 0 ga maxsus va aniq ma'noga ega. Bu ma'lum nol qiymatidan farqli ravishda qiymat yoki noma'lum. Ba'zi ma'lumotlar bazasi puristlari jadvaldagi qatorlar NULL-larga ega bo'lmasligini ta'kidlaydilar!

Agar manba jadvalidagi NULLlar nol bo'lsa, u holda ularni o'zgartiring, aks holda so'rovlaringiz orqali tarqaladigan nullalar bilan ish tuting.

0
qo'shib qo'ydi

Yangilash parametrini bajarish uchun dinamik so'rovni talab qildim. Yuqoridagi postdan qarz olish va boshqa quyidagilarga ega:

            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
qo'shib qo'ydi