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.
6 Réponses :
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 !!!
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.
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>
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.
..CASE WHEN sampCol IS NULL THEN to_number('') ELSE sampCol END as sampCol
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), '') code >.
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.
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
Veuillez corriger la mise en forme de votre réponse. De plus, un peu plus de description aiderait tout lecteur à mieux comprendre votre code.
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)),'')