Wie überprüfe ich, ob eine SQL Server-Textspalte leer ist?

183

Ich verwende SQL Server 2005. Ich habe eine Tabelle mit einer Textspalte und viele Zeilen in der Tabelle, in denen der Wert dieser Spalte nicht null ist, sondern leer. Der Versuch, mit '' zu vergleichen, ergibt diese Antwort:

Die Datentypen text und varchar sind im Operator ungleich nicht kompatibel.

Gibt es eine spezielle Funktion, um festzustellen, ob der Wert einer Textspalte nicht null, sondern leer ist?

atoumey
quelle
1
Ich würde den Datentyp nach Möglichkeit in varchar (max) konvertieren. Der Text ist veraltet. Am besten nehmen Sie die Änderungen jetzt vor, wenn Sie die Tabelle berühren. Erkundigen Sie sich natürlich bei Ihrer dba. Aber je mehr Dinge konvertiert werden können, bevor sie konvertiert werden müssen, desto besser ist mein Gedanke. Es hängt davon ab, wie viel Code Sie verwenden, um beispielsweise Text zu enthalten und zu schreiben, der fehlerhaft ist, ob dies jetzt getan werden soll, aber ich spreche es an, sodass Sie sich bewusst sind, dass dies irgendwann geändert werden muss.
HLGEM

Antworten:

304
where datalength(mytextfield)=0
Eric Z Bart
quelle
2
Dies war nicht die eigentliche Frage, sondern nur eine Bemerkung für Leute, die nur den Titel lesen. Vergessen Sie nicht hinzuzufügen, OR mytextfield IS NULLwann Ihre Kolumne sein kannNULL
Daan
2
mytextfield IS NULL *OR*:-)
Ban-Geoengineering
3
@ ban-geoengineering SQL Server T-SQL berücksichtigt keine Kurzschlussbewertungstechniken, daher hat die Reihenfolge hier keinen Einfluss auf das Ergebnis.
Conrad
47
ISNULL(
case textcolum1
    WHEN '' THEN NULL
    ELSE textcolum1
END 
,textcolum2) textcolum1
Eric
quelle
Die obige Abfrage behandelt tatsächlich die Nichtigkeit und Leere einer Textspalte und weist dementsprechend einen Wert basierend auf der Bedingung zu. Upvote für die Antwort, da dies das ist, wonach ich gesucht habe. Danke
user_v
28

Eigentlich müssen Sie nur den LIKE-Operator verwenden.

SELECT * FROM mytable WHERE mytextfield LIKE ''
Däne
quelle
+1 Ich bevorzuge diese Antwort gegenüber den anderen hier, da sie nicht vom zusätzlichen Aufwand beim Aufrufen von SQL-Funktionen wie DataLength (), IsNull () oder Cast () abhängt. Möglicherweise ist der generierte Abfrageplan derselbe (ich habe ihn nicht überprüft). Trotzdem finde ich, dass dies ein weitaus saubererer Ansatz ist.
MikeTeeVee
5

So erhalten Sie nur leere Werte (und keine Nullwerte):

SELECT * FROM myTable WHERE myColumn = ''

So erhalten Sie sowohl Null- als auch Leerwerte:

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

So erhalten Sie nur Nullwerte:

SELECT * FROM myTable WHERE myColumn IS NULL

So erhalten Sie andere Werte als null und leer:

SELECT * FROM myTable WHERE myColumn <> ''


Und denken Sie daran, LIKE-Phrasen nur bei Bedarf zu verwenden, da sie die Leistung im Vergleich zu anderen Sucharten beeinträchtigen.

Nima
quelle
Meinst du nicht myColumn IS NOT NULL AND my column = '';?
bcsb1001
2

Verwenden Sie den Operator IS NULL:

Select * from tb_Employee where ename is null
Perle
quelle
1
atoumey stellt in der Frage fest, dass "der Wert dieser Spalte nicht null ist, sondern leer", daher würde ISNULL () nicht funktionieren :)
GazB
2
SELECT * FROM TABLE
WHERE ISNULL(FIELD, '')=''
Enrique Garcia
quelle
1
upvoted, aber ... wo ISNULL (TRIM (Field), '') = '' noch besser ist ;-), wenn Sie das Gefühl haben, dass "" eine leere Zeichenfolge ist, auch wenn Leerzeichen darin sind
Kirsten
Für MySQL lautet die korrekte Syntax:SQL SELECT * FROM TABLE WHERE IFNULL(FIELD, '')=''
Cláudio Silva
1

Ich weiß, dass dieser Beitrag uralt ist, aber ich fand ihn nützlich.

Mein Problem, den Datensatz mit einem nicht leeren Textfeld zurückzugeben, wurde nicht behoben, sodass ich dachte, ich würde meine Lösung hinzufügen.

Dies ist die where-Klausel, die für mich funktioniert hat.

WHERE xyz LIKE CAST('% %' as text)
Mike Roberts
quelle
1

Verwenden Sie die DATALENGTH- Methode, zum Beispiel:

SELECT length = DATALENGTH(myField)
FROM myTABLE
Jorgesys
quelle
0

Sind null und eine leere Zeichenfolge gleichwertig? Wenn dies der Fall ist, würde ich Logik in meine Anwendung aufnehmen (oder möglicherweise einen Auslöser, wenn die App "out-of-the-box" ist?), Um zu erzwingen, dass das Feld entweder null oder '' ist, aber nicht das andere. Wenn Sie mit '' gegangen sind, können Sie die Spalte auch auf NOT NULL setzen. Nur eine Sache der Datenreinheit.

Tyler Gooch
quelle
0

Ich wollte, dass ein vordefinierter Text ("No Labs Available") angezeigt wird, wenn der Wert null oder leer ist, und mein Freund hat mir dabei geholfen:

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
quelle
Wow, eine Unterabfrage. Das ist überhaupt nicht teuer.
Jay Croghan
0

Sie müssen beides tun:

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

Marklark
quelle
0

Ich weiß, dass es viele Antworten mit Alternativen zu diesem Problem gibt, aber ich möchte nur zusammenstellen, was ich als die beste Lösung von @Eric Z Beard & @Tim Cooper mit @Enrique Garcia & @Uli Köhler gefunden habe.

Falls erforderlich, um die Tatsache zu berücksichtigen, dass in Ihrem Anwendungsfallszenario nur Leerzeichen mit Leerzeichen identisch sein kann, da die folgende Abfrage 1 und nicht 0 zurückgibt.

SELECT datalength(' ')

Deshalb würde ich mich für etwas entscheiden wie:

SELECT datalength(RTRIM(LTRIM(ISNULL([TextColumn], ''))))
Löwe
quelle
0

Versuche dies:

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

Ich hoffe dir zu helfen!

Luiz Fernando Corrêa Leite
quelle
0

Anstatt a zu isnullverwenden case, ist es aus Leistungsgründen besser.

case when campo is null then '' else campo end

In Ihrer Ausgabe müssen Sie Folgendes tun:

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

Code wie folgt:

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
quelle
Sie überprüfen zuerst, ob null ist, dann verwenden Sie die Len-Funktion ... Ich hoffe, es hilft
Enrique Garcia
Was ist, wenn die Spalte nicht NULL und leer ist und keinen Text enthält?
Sayed Muhammad Idrees
0
DECLARE @temp as nvarchar(20)

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

SELECT IIF(ISNULL(@temp,'')='','[Empty]',@temp)
user11968038
quelle