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
.
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 à ''
.
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 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
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'
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
Peut-être quelque chose comme ça?
UPDATE [MyTable]
SET [SomeField] = NULL
WHERE [SomeField] is not NULL
AND LEN(LTRIM(RTRIM([SomeField]))) = 0
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.