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
.
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 ''
.
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.
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
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'
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
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.