Comment convertir les espaces vides en valeurs null, en utilisant SQL Server?

J'ai une table et les colonnes de cette table contient des espaces vides pour certains dossiers. Maintenant, je dois déplacer les données vers une autre table et remplacer les espaces vides par une valeur NULL.

J'ai essayé d'utiliser:

REPLACE(ltrim(rtrim(col1)),' ',NULL)

Mais ça ne marche pas. Il convertira toutes les valeurs de col1 en NULL. Je veux juste convertir uniquement les valeurs qui ont des espaces vides en NULL.

34
demandé sur Leigh 2010-09-13 19:23:00

7 réponses

Avez-vous essayé?

UPDATE table 
SET col1 = NULL 
WHERE col1 = ''

, Comme les commentateurs le soulignent, vous n'avez pas à faire ltrim() ou rtrim(), et NULL colonnes ne correspondent pas ''.

36
répondu egrunin 2010-09-20 03:06:47

J'ai résolu un problème similaire en utilisant la fonction NULLIF:

UPDATE table 
SET col1 = NULLIF(col1, '')

À partir de la référence T-SQL:

NULLIF renvoie la première expression si les deux expressions ne sont pas égales. Si les expressions sont égales, NULLIF renvoie une valeur null du type de la première expression.

88
répondu geca 2012-10-05 08:49:27

SQL Server ignore les espaces de fin lors de la comparaison des chaînes, donc''=". Utilisez simplement la requête suivante pour votre mise à jour

UPDATE table
SET col1 = NULL
WHERE col1 = ''

Les valeurs NULL dans votre table resteront NULL, et les col1 avec n'importe quel nombre sur l'espace seuls les caractères seront changés en NULL.

Si vous voulez faire pendant votre copie d'une table à l'autre, utilisez ceci:

INSERT INTO newtable ( col1, othercolumn )
SELECT
   NULLIF(col1, ''),
   othercolumn
FROM table
21
répondu Bennor McCarthy 2010-09-20 00:45:08

Ce code génère du SQL qui peut y parvenir sur chaque table et Colonne de la base de données:

SELECT
   'UPDATE ['+T.TABLE_SCHEMA+'].[' + T.TABLE_NAME + '] SET [' + COLUMN_NAME + '] = NULL 
   WHERE [' + COLUMN_NAME + '] = '''''
FROM 
    INFORMATION_SCHEMA.columns C
INNER JOIN
    INFORMATION_SCHEMA.TABLES T ON C.TABLE_NAME=T.TABLE_NAME AND C.TABLE_SCHEMA=T.TABLE_SCHEMA
WHERE 
    DATA_TYPE IN ('char','nchar','varchar','nvarchar')
AND C.IS_NULLABLE='YES'
AND T.TABLE_TYPE='BASE TABLE'
9
répondu gls123 2016-08-30 12:29:39

Une instruction case devrait faire l'affaire lors de la sélection à partir de votre table source:

CASE
  WHEN col1 = ' ' THEN NULL
  ELSE col1
END col1

En outre, une chose à noter est que votre LTRIM et RTRIM réduisent la valeur d'un espace ( '' ) à vide ("). Si vous devez supprimer des espaces blancs, l'instruction case doit être modifiée de manière appropriée:

CASE
  WHEN LTRIM(RTRIM(col1)) = '' THEN NULL
  ELSE LTRIM(RTRIM(col1))
END col1
8
répondu craigh2 2010-09-13 15:30:07

Peut-être quelque chose comme ça?

UPDATE [MyTable]
SET [SomeField] = NULL
WHERE [SomeField] is not NULL
AND LEN(LTRIM(RTRIM([SomeField]))) = 0
6
répondu 2010-09-13 15:26:22

Voici une regex pour vous.

update table
set col1=null
where col1 not like '%[a-z,0-9]%'

Trouve essentiellement toutes les colonnes qui n'ont pas de lettres ou de chiffres et la définit sur null. pourrait avoir à mettre à jour si vous avez des colonnes avec seulement des caractères spéciaux.

-1
répondu DForck42 2010-09-13 15:57:25