52 votes

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

J'ai une table et les colonnes de cette table contiennent des espaces vides pour certains enregistrements. 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 .

126voto

geca Points 593

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

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

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 nulle du type de la première expression.

50voto

egrunin Points 15356

Avez-vous essayé cela?

 UPDATE table 
SET col1 = NULL 
WHERE col1 = ''

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

33voto

Bennor McCarthy Points 6588

SQL Server ignore les espaces de fin lors de la comparaison de 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 col1s avec n'importe quel nombre sur l'espace uniquement les caractères seront changés en NULL.

Si vous souhaitez le faire lors de votre copie d'une table à une autre, utilisez ceci :

 INSERT INTO newtable ( col1, othercolumn )
SELECT
   NULLIF(col1, ''),
   othercolumn
FROM table

15voto

gls123 Points 2013

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'

12voto

craigh2 Points 121

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

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

En outre, une chose à noter est que vos LTRIM et RTRIM réduisent la valeur d'un espace (' ') à un espace (''). Si vous devez supprimer les espaces blancs, l'instruction case doit être modifiée en conséquence :

 CASE
  WHEN LTRIM(RTRIM(col1)) = '' THEN NULL
  ELSE LTRIM(RTRIM(col1))
END col1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X