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?

atoumey
la source
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
Eric Z Beard
la source
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
Eric
la source
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 ''
Danois
la source
+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.

Nima
la source
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
perle
la source
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, '')=''
Enrique Garcia
la source
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)
Mike Roberts
la source
1

Utilisez la méthode DATALENGTH , par exemple:

SELECT length = DATALENGTH(myField)
FROM myTABLE
Jorgesys
la source
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.

Tyler Gooch
la source
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
Yoosaf Abdulla
la source
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 ''

Marklark
la source
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], ''))))
Leo
la source
0

essaye ça:

select * from mytable where convert(varchar, mycolumn) = ''

j'espère vous aider!

Luiz Fernando Corrêa Leite
la source
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
Enrique Garcia
la source
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)
user11968038
la source