Comment vérifier si une colonne de texte SQL Server est vide?


183

J'utilise SQL Server 2005. J'ai une table avec une colonne de texte et j'ai de nombreuses lignes dans la table où la valeur de cette colonne n'est pas nulle, mais elle est vide. Essayer de comparer avec '' donne cette réponse:

Les types de données text et varchar sont incompatibles dans l'opérateur différent de.

Existe-t-il une fonction spéciale pour déterminer si la valeur d'une colonne de texte n'est pas nulle mais vide?


1
Je convertirais le type de données si possible en varchar (max), le texte a été obsolète - il est préférable de commencer à apporter les modifications maintenant si vous touchez la table. Vérifiez avec votre dba bien sûr. Mais plus les choses peuvent se convertir avant de devoir être converties, meilleure est ma pensée. Cela dépendra de la quantité de code que vous avez en utilisant des choses comme contient et écrivez du texte qui sera interrompu pour savoir s'il faut faire cela maintenant, mais je l'évoque, vous savez donc que cela devra être changé à terme.
HLGEM

Réponses:


304
where datalength(mytextfield)=0

2
Ce n'était pas la vraie question, mais juste une remarque pour les personnes qui ne lisent que le titre, n'oubliez pas d'ajouter OR mytextfield IS NULLquand votre colonne peut êtreNULL
Daan

2
mytextfield IS NULL *OR*:-)
ban-geoengineering

3
@ ban-geoengineering SQL Server T-SQL n'honore pas les techniques d'évaluation de court-circuit, donc l'ordre ici n'affecte pas le résultat.
Conrad

47
ISNULL(
case textcolum1
    WHEN '' THEN NULL
    ELSE textcolum1
END 
,textcolum2) textcolum1

La requête ci-dessus gérera en fait la nature nulle et vide d'une colonne de texte et attribuera en conséquence une valeur en fonction de la condition. J'apprécie la réponse car c'est ce que je cherchais. Merci
user_v

28

En fait, il vous suffit d'utiliser l'opérateur LIKE.

SELECT * FROM mytable WHERE mytextfield LIKE ''

+1 Je préfère cette réponse aux autres ici car elle ne repose pas sur la surcharge supplémentaire de l'appel de fonctions SQL telles que DataLength (), IsNull () ou Cast (). Peut-être que le plan de requête généré est le même (je n'ai pas vérifié); je trouve toujours que c'est une approche beaucoup plus propre.
MikeTeeVee

5

Pour obtenir uniquement des valeurs vides (et non des valeurs nulles):

SELECT * FROM myTable WHERE myColumn = ''

Pour obtenir à la fois des valeurs nulles et vides:

SELECT * FROM myTable WHERE myColumn IS NULL OR myColumn = ''

Pour obtenir uniquement des valeurs nulles:

SELECT * FROM myTable WHERE myColumn IS NULL

Pour obtenir des valeurs autres que nulles et vides:

SELECT * FROM myTable WHERE myColumn <> ''


Et n'oubliez pas de n'utiliser des phrases LIKE que lorsque cela est nécessaire, car elles dégraderont les performances par rapport à d'autres types de recherche.


Tu ne veux pas dire myColumn IS NOT NULL AND my column = '';?
bcsb1001

2

Utilisez l'opérateur IS NULL:

Select * from tb_Employee where ename is null

1
atoumey déclare dans la question que "la valeur de cette colonne n'est pas nulle, mais elle est vide" donc ISNULL () ne fonctionnerait pas :)
GazB

2
SELECT * FROM TABLE
WHERE ISNULL(FIELD, '')=''

1
upvoté, mais ... où ISNULL (TRIM (Field), '') = '' est encore mieux ;-), si vous sentez que "" est une chaîne vide même avec des espaces à l'intérieur
Kirsten

Pour MySQL, la syntaxe correcte est:SQL SELECT * FROM TABLE WHERE IFNULL(FIELD, '')=''
Cláudio Silva

1

Je sais que cet article est ancien mais je l'ai trouvé utile.

Cela n'a pas résolu mon problème de retour de l'enregistrement avec un champ de texte non vide, j'ai donc pensé ajouter ma solution.

C'est la clause where qui a fonctionné pour moi.

WHERE xyz LIKE CAST('% %' as text)



0

Est-ce que null et une chaîne vide sont équivalentes? S'ils le sont, j'inclurais une logique dans mon application (ou peut-être un déclencheur si l'application est "prête à l'emploi"?) Pour forcer le champ à être nul ou '', mais pas l'autre. Si vous avez choisi «», vous pouvez également définir la colonne sur NOT NULL. Juste une chose de propreté des données.


0

Je voulais avoir un texte prédéfini ("Aucun laboratoire disponible") à afficher si la valeur était nulle ou vide et mon ami m'a aidé avec ceci:

StrengthInfo = CASE WHEN ((SELECT COUNT(UnitsOrdered) FROM [Data_Sub_orders].[dbo].[Snappy_Orders_Sub] WHERE IdPatient = @PatientId and IdDrugService = 226)> 0)
                            THEN cast((S.UnitsOrdered) as varchar(50))
                    ELSE 'No Labs Available'
                    END

Wow, une sous-requête. Ce n'est pas du tout cher.
Jay Croghan

0

Vous devez faire les deux:

SELECT * FROM Table WHERE Text IS NULL or Text LIKE ''


0

Je sais qu'il y a beaucoup de réponses avec des alternatives à ce problème, mais je voudrais simplement rassembler ce que j'ai trouvé comme la meilleure solution par @Eric Z Beard & @Tim Cooper avec @Enrique Garcia & @Uli Köhler.

Si nécessaire, pour gérer le fait que l'espace uniquement peut être identique à vide dans votre scénario d'utilisation, car la requête ci-dessous renverra 1, pas 0.

SELECT datalength(' ')

Par conséquent, j'irais pour quelque chose comme:

SELECT datalength(RTRIM(LTRIM(ISNULL([TextColumn], ''))))


0

Au lieu d'utiliser isnulluse a case, en raison des performances, c'est mieux le cas.

case when campo is null then '' else campo end

Dans votre problème, vous devez faire ceci:

case when campo is null then '' else
  case when len(campo) = 0 then '' else campo en
end

Code comme celui-ci:

create table #tabla(
id int,
campo varchar(10)
)

insert into #tabla
values(1,null)

insert into #tabla
values(2,'')

insert into #tabla
values(3,null)

insert into #tabla
values(4,'dato4')

insert into #tabla
values(5,'dato5')

select id, case when campo is null then 'DATA NULL' else
  case when len(campo) = 0 then 'DATA EMPTY' else campo end
end
from #tabla

drop table #tabla

vous vérifiez d'abord si est nul, puis vous utilisez la fonction len ... j'espère que cela aide
Enrique Garcia

Que faire si la colonne n'est pas NULL et vide, n'ayant pas de texte?
Sayed Muhammad Idrees le

0
DECLARE @temp as nvarchar(20)

SET @temp = NULL
--SET @temp = ''
--SET @temp = 'Test'

SELECT IIF(ISNULL(@temp,'')='','[Empty]',@temp)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.