SQL барлық NULL-ті ауыстырады

Менде кейбір NULL бар үлкен үстел бар. Кестеден NULL-дің орнына 0-нен таңдаудың ең оңай жолы қандай?

Немесе мұны істеудің оңай жолы болмаса, кестеде барлық нөлдерді физикалық түрде 0-ге ауыстыруға дайынмын.

Көптеген бағандар бар, олардың әрқайсысын ISNULL (FieldName, 0) сияқты 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!

Бұл әрекетті орындаған кезде WHERE WHERE ұмытпаңыз немесе барлығы 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'

Ол сіз үшін үлкен ol 'сұранымын шашыратады.

1
қосылды

Немесе ISNULL , ANSI SQL үйлесімді болып табылатын COALESCE функциясын қолдана аласыз.

select coalesce(yourcolumn, 0)

Көптеген бағандар бар, олардың әрқайсысы арқылы FieldName ISNULL (FieldName, 0) тәрізді бір нәрсе арқылы өтуді қаламаймын.

Сіз өзіңіз қалаған нәрсені үнемі ала алмайсыз. Өкінішті. Бұл әдіс: баған бойынша баған.

0
қосылды

Мен FieldName атауымен ISNULL (FieldName, 0) сияқты нәрселермен айналысуды қаламаймын.

Хитке ие болыңыз және әрқайсысы үшін бір рет орындаңыз:

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
қосылды