1
votes

Remplacez NULL par une valeur vide (SQL Server)

Remplacez la valeur NULL par une valeur vide

En essayant de convertir NULL en valeur vide en utilisant une instruction CASE.

Remarque: sampCol est un identifiant numérique

,CASE WHEN sampCol IS NULL THEN '' ELSE sampCol END as sampCol

J'obtiens l'erreur suivante:

Erreur lors de la conversion du type de données varchar en numérique.


0 commentaires

6 Réponses :


5
votes

En effet, une expression case peut renvoyer un seul et unique type de données selon la priorité des types de données. Vous ne pouvez pas convertir une chaîne vide en un type de données numérique. Ce que vous essayez de faire semble appartenir à la couche de présentation et non à la couche de données. Laissez NULL arriver !!!


2 commentaires

Il n'y a donc aucun moyen de le faire?


Il y a toujours un moyen. Mais dans ce cas, vous ne devriez pas. Votre logique de présentation n'appartient pas à la base de données.



5
votes

Vous mélangez des valeurs numériques et des chaînes.

Un NULL n'est pas une chaîne vide. C'est l'absence de valeur.

Des éléments comme celui-ci devraient vraiment être relégués à la couche de présentation, mais si vous le devez, essayez la triche suivante.

...
, concat('',sampCol) as sampCol 
...

p>


5 commentaires

cela irait-il sous la déclaration WHERE?


@PhilK Non. Ceci est la colonne. Je n'ai aucune idée de votre déclaration WHERE


"devrait vraiment être relégué à la couche de présentation" << 100% d'accord. (à la personne qui a écrit la question originale ... VEUILLEZ obtenir cette conversion vaudou de votre datalayer. Ceci est un problème de présentation.


Désolé, je voulais dire la clause WHERE, mais oui je viens de comprendre ce que vous vouliez dire. Mais oui, cela a totalement fonctionné. Merci


Bien que cela fonctionne, cela signifie maintenant que 10 <2, ce qui est tout simplement faux. Les mises en garde ont cependant été données ici; cela n'appartient pas au côté RDBMS des choses. Mais cela ne devrait certainement pas aller dans le WHERE @PhilK. Cela ruinera les performances de votre requête.



-1
votes
    ..CASE WHEN sampCol IS NULL THEN to_number('') ELSE sampCol END as sampCol

3 commentaires

to_number ('') n'est pas un nom de fonction intégré reconnu.


Ah SQL Server. ..CASE WHEN sampCol EST NULL THEN cast ('' as number) ELSE sampCol END as sampCol


Il existe des fonctions qui gèrent cette situation exacte. Pas besoin de CASE . Pour T-SQL, utilisez ISNULL (CAST (sampCol AS VARCHAR (100), '') ou SQL générique COALESCE (CAST (sampCol AS VARCHAR (100), '') .



2
votes

Utiliser COALESCE () avec CAST () aidera:

SELECT COALESCE(CAST(SampCol AS VARCHAR (10)), '') AS SampCol
FROM TestTable

Ici au lieu de VARCHAR (10) , vous pouvez modifier la longueur requise selon les besoins de votre entreprise.

Démo sur db fiddle


0 commentaires

1
votes

Script pour corriger toutes les valeurs nulles dans la base de données

/ Par Brian Alvarez Ayala / courriel - brian.alvarez@yahoo.com site Web - w w w. a s e s o r i a r e m o t a. c o m

Déclarer @COLUMN_NAME varchar (40) Déclarer @DATA_TYPE varchar (40) Déclarer @TABLES_NAMES varchar (40) Déclarer @TABLE_SCHEMA varchar (40) Déclarer @IS_NULLABLE varchar (3)

Déclarer @SqlCMD varchar (MAX) Déclarer le curseur de tablas pour sélectionnez t.TABLE_SCHEMA, t.TABLE_NAME, c.COLUMN_NAME, c.DATA_TYPE, c.IS_NULLABLE dans INFORMATION_SCHEMA.TABLES t jointure interne INFORMATION_SCHEMA.COLUMNS c sur c.TABLE_NAME = t.TABLE_NAME et c.TABLE_SCHEMA = t.TABLE_SCHEMA tablas ouverts chercher le suivant de tablas dans @ TABLE_SCHEMA, @ TABLES_NAMES, @ COLUMN_NAME, @ DATA_TYPE, @ IS_NULLABLE tandis que @@ FETCH_STATUS = 0 commencer
if (@DATA_TYPE = 'numeric' ou @DATA_TYPE = 'int') et @ IS_NULLABLE = 'OUI' commencer set @SqlCMD = 'Update' + @TABLE_SCHEMA + '.' + @ TABLES_NAMES + 'set' + @COLUMN_NAME + '= 0 où' + @COLUMN_NAME + 'est nul' imprimer @sqlcmd end

    if (@DATA_TYPE = 'nvarchar' or @DATA_TYPE = 'varchar' or @DATA_TYPE = 'char') and @IS_NULLABLE='YES'
    begin
        set @SqlCMD ='Update ' + @TABLE_SCHEMA+'.'+@TABLES_NAMES + ' set ' + @COLUMN_NAME + ' = ' + ''' ''' + ' where ' + @COLUMN_NAME + ' is null'
        print @sqlcmd
    end

    if (@DATA_TYPE = 'bit') and @IS_NULLABLE='YES'
    begin
        set @SqlCMD ='Update ' + @TABLE_SCHEMA+'.'+@TABLES_NAMES + ' set ' + @COLUMN_NAME + ' = ' + '''False''' + ' where ' + @COLUMN_NAME + ' is null'
        print @sqlcmd
    end

    fetch next from tablas into @TABLE_SCHEMA,@TABLES_NAMES,@COLUMN_NAME,@DATA_TYPE,@IS_NULLABLE
end 

fermer les tablas désallouer des tablas


1 commentaires

Veuillez corriger la mise en forme de votre réponse. De plus, un peu plus de description aiderait tout lecteur à mieux comprendre votre code.



2
votes

Ajout à la réponse de Shawn May. Trois crochets gauches et seulement 2 crochets droits ne fonctionneront jamais. Essayez:

ISNULL(CAST(sampCol AS VARCHAR(100)),'') as samplColName

Ajoutez peut-être le nom du champ en utilisant AS afin de pouvoir l'utiliser dans votre application.

ISNULL(CAST(sampCol AS VARCHAR(100)),'')


0 commentaires