Comment convertir les espaces vides en valeurs null, en utilisant SQL Server?
-
02-10-2019 - |
Question
J'ai une table et les colonnes de ce tableau contient des espaces vides pour certains dossiers. Maintenant, je dois déplacer les données vers une autre table et remplacer les espaces vides avec une valeur NULL
.
J'essayé d'utiliser:
REPLACE(ltrim(rtrim(col1)),' ',NULL)
mais il ne fonctionne pas. Il convertit toutes les valeurs de col1
à NULL
. Je veux juste convertir uniquement les valeurs qui ont des espaces vides à NULL
.
La solution
Avez-vous essayé cela?
UPDATE table
SET col1 = NULL
WHERE col1 = ''
Comme les commentateurs font remarquer, vous ne devez pas faire ltrim()
ou rtrim()
, et les colonnes de NULL
ne correspondra pas à ''
.
Autres conseils
Je résolu un problème similaire en utilisant la fonction NULLIF
:
UPDATE table
SET col1 = NULLIF(col1, '')
NULLIF renvoie la première expression si les deux expressions ne sont pas égaux. Si les expressions sont égales, NULLIF retourne une valeur nulle du type de la première expression.
SQL Server ignore lorsque l'on compare espaces à la fin des chaînes, alors '' = ''. 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 restera NULL, et col1s avec un nombre quelconque sur l'espace que des caractères seront changés à NULL.
Si vous voulez le faire lors de la copie d'une table à une autre, utilisez ceci:
INSERT INTO newtable ( col1, othercolumn )
SELECT
NULLIF(col1, ''),
othercolumn
FROM table
Ce code génère une SQL qui peut arriver sur toutes les tables et la colonne dans 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 déclaration de cas devrait faire l'affaire lors de la sélection 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éduire la valeur d'un espace ( « « ) à blanc ( » »). Si vous avez besoin d'enlever l'espace blanc, puis la déclaration de cas devrait être modifié de manière appropriée:
CASE
WHEN LTRIM(RTRIM(col1)) = '' THEN NULL
ELSE LTRIM(RTRIM(col1))
END col1
Peut-être quelque chose comme ça?
UPDATE [MyTable]
SET [SomeField] = NULL
WHERE [SomeField] is not NULL
AND LEN(LTRIM(RTRIM([SomeField]))) = 0
voici un regex pour toi.
update table
set col1=null
where col1 not like '%[a-z,0-9]%'
essentiellement trouve des colonnes qui n'avez pas des lettres ou des chiffres en eux et ensembles à null. pourrait avoir à mettre à jour si vous avez des colonnes avec des caractères spéciaux juste.