web-dev-qa-db-fra.com

Comment convertir des espaces vides en valeurs NULL à l'aide de 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 va convertir toutes les valeurs de col1 à NULL. Je veux juste convertir uniquement les valeurs qui ont des espaces vides en NULL.

41
niceApp

Avez-vous essayé cela?

UPDATE table 
SET col1 = NULL 
WHERE col1 = ''

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

40
egrunin

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.

96
geca

SQL Server ignore les espaces finaux lors de la comparaison de chaînes, donc '' = ''. Il suffit d'utiliser 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 caractères col1 avec un nombre quelconque d'espaces seulement seront remplacés par NULL.

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

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

Ce code génère du SQL qui peut le faire 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'
12
gls123

Une déclaration de cas devrait faire l'affaire en sélectionnant dans votre table source:

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

En outre, il convient de noter que votre LTRIM et votre RTRIM réduisent la valeur d'un espace ('') à un blanc (''). Si vous devez supprimer des espaces, l'instruction de cas doit être modifiée en conséquence:

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

Peut-être quelque chose comme ça?

UPDATE [MyTable]
SET [SomeField] = NULL
WHERE [SomeField] is not NULL
AND LEN(LTRIM(RTRIM([SomeField]))) = 0
7
user151323

voici une regex un pour toi.

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

recherche essentiellement toutes les colonnes qui ne contiennent pas de lettres ou de chiffres et les définit sur null. vous devrez peut-être mettre à jour si vous avez des colonnes contenant uniquement des caractères spéciaux.

0
DForck42