2017-10-16 2 views
0

Je viens d'écrire une requête pour remplacer toutes les guillemets dans mes données d'entrée (à partir d'un fichier csv qui est délimité par des tuyaux mais qui a aussi des guillemets autour de chaque colonne) Je suis en train de fusionner simultanément la première colonne (qui est une colonne nvarchar), mais je ne peux pas obtenir mon instruction coalesce comme supprimant les doubles guillemets SQL ne reconnaît pas la colonne comme vide (ne correspond pas à la valeur NULL)).Reconnaître le remplacement de "" "en tant que 'null' dans le serveur SQL

Apprécierions vraiment aucune aide sur ce que je peux faire pour SQL reconnaître que Column1, une fois débarrassé de « », est maintenant plein de blancs et devrait donc tirer des données des colonnes 2, 3 ou 4!

Insert Into [mytable] 
Select COALESCE (REPLACE (Column1,'"', ''), REPLACE (Column 2, '"', ''), 
REPLACE (Column3, '"', ''), REPLACE (Column4, '"', '')) 
From [datasource] 
+0

'' n'est pas nul, vous écrivez des chaînes vides dans vos colonnes au lieu de null. Essayez de remplacer '' par null dans votre requête – GuidoG

+0

Merci @ GuidoG, c'était en effet le problème mais certains enregistrements ont des données en eux donc je voulais simplement supprimer les citations, pas annuler le champ entier – Sam109

Répondre

0

assez lourd, mais vous pouvez utiliser NULLIF avec LTRIM et:

Select COALESCE (NULLIF(LTRIM(REPLACE (Column1,'"', '')), ''), 
       REPLACE (Column 2, '"', ''), 
       REPLACE (Column3, '"', ''), 
       REPLACE (Column4, '"', '')) 
From [datasource] 

LTRIM supprimera tous les espaces en de votre chaîne. Si elle contient seulement des espaces blancs, LTRIM retournera une chaîne vide. NULLIF renverra null si les deux arguments passés à sont égaux.

Mon exemple est seulement pour la première colonne, utilisez-le sur les autres colonnes si vous avez besoin.

+0

Merci beaucoup! Cela fonctionne parfaitement – Sam109

+0

Heureux d'aider :-) –

0

Vous pouvez utiliser une expression CASE:

INSERT INTO [mytable] 
SELECT 
    CASE WHEN LEN(REPLACE(COALESCE(Column1, ''), '"', '')) > 0 
     THEN REPLACE(COALESCE(Column1, ''), '"', '') 
     WHEN LEN(REPLACE(COALESCE(Column2, ''), '"', '')) > 0 
     THEN REPLACE(COALESCE(Column2, ''), '"', '') 
     CASE WHEN LEN(REPLACE(COALESCE(Column3, ''), '"', '')) > 0 
     THEN REPLACE(COALESCE(Column3, ''), '"', '') 
     WHEN LEN(REPLACE(COALESCE(Column4, ''), '"', '')) > 0 
     THEN REPLACE(COALESCE(Column4, ''), '"', '') 
     ELSE '' END 
FROM [datasource] 

Je pense qu'une partie de la laideur de cette requête est due à votre modèle de données. Idéalement, vous ne stockez pas du tout des citations de doute, juste le contenu réel. Ensuite, nous pourrions simplement utiliser NULL ou une chaîne vide pour décider quel contenu insérer.

+0

Désolé si ce n'était pas clair - Je certainement Je ne veux pas stocker les guillemets doubles! Le but du remplacement est de se débarrasser d'eux lors du téléchargement dans ma base de données. Cependant quand j'utilise remplacer pour se débarrasser des guillemets doubles sql ne reconnaît pas que Column1 n'est pas null - il montre juste comme un vide - donc coalesce ne fonctionne pas – Sam109

+0

@ Sam109 Avez-vous pris la peine d'essayer ma réponse (ou toute réponse d'ailleurs) ? –

1
Insert Into [mytable] 
Select NULLIF(COALESCE (REPLACE (Column1,'"', ''), REPLACE (Column 2, '"', ''), 
REPLACE (Column3, '"', ''), REPLACE (Column4, '"', '')),'') 
From [datasource] 
+0

Merci - ceci reconnaît Column1 comme 'null' mais n'effectue pas la fonction coalesce – Sam109