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.

Était-ce utile?

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, '')

De la référence T-SQL:

  

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top