Wie überprüfe ich, ob eine Spalte in MySQL leer oder null ist?
288
Ich habe eine Spalte in einer Tabelle, die null oder leere Werte enthalten kann. Wie überprüfe ich, ob eine Spalte in den in einer Tabelle vorhandenen Zeilen leer oder null ist?
Wenn Sie die Bedingung in WHERE some_col IS NULL OR some_col = ' '(ein in die Zeichenfolge eingefügtes Leerzeichen) ändern , funktioniert dies sowohl unter MySQL als auch unter Oracle (siehe Antwort von "onedaywhen"). some_col = ''funktioniert unter Oracle nicht, da leere Zeichenfolgen dort NULL bedeuten.
Johanna
1
@ Johanna, aber wenn Sie zu wechseln ' ', funktioniert es in SQLite nicht. Es werden nur identische / direkte Zeichenfolgenübereinstimmungen verarbeitet.
Magne
131
Wie im SQL-92-Standard definiert, wird beim Vergleichen von zwei Zeichenfolgen unterschiedlicher Breite der schmalere Wert mit Leerzeichen rechts aufgefüllt, damit er dieselbe Breite wie der breitere Wert hat. Daher werden alle Zeichenfolgenwerte, die vollständig aus Leerzeichen bestehen (einschließlich Null-Leerzeichen), als gleich angesehen, z
Vielen Dank für die Erwähnung der gepolsterten Räume. Sie können davon profitieren und die Bedingung in WHERE some_col IS NULL OR some_col = ' '(ein in die Zeichenfolge eingefügtes Leerzeichen) ändern, dann funktioniert es sowohl unter MySQL als auch unter Oracle. some_col = ''funktioniert unter Oracle nicht, da leere Zeichenfolgen dort NULL bedeuten und die vollständige Bedingung NULL wird.
Johanna
Meine Anforderung war es, MySQL zu finden SELECT * FROM T WHERE some_col IS NOT NULL OR same_col <> ' '; und SELECT * FROM T WHERE NULLIF(some_col, ' ') IS NOT NULL;für mich zu arbeiten. Hoffe das wird nützlich sein.
Dinuka Dayarathna
Funktioniert tatsächlich '' = ' 'in SQLServer, aber nicht in SQLite, soweit ich das beurteilen kann, nachdem ich es jetzt getestet habe.
Magne
66
Ein kürzerer Weg, um die Bedingung zu schreiben:
WHERE some_col >''
Schon seit null > '' produziert unknown, hat dies die Wirkung der Filterung beide aus nullund leeren Saiten.
Gibt es eine Möglichkeit, das Gegenteil davon zu erreichen und alle Datensätze dort abzurufen, wo es NULL oder eine leere Zeichenfolge ist?
Joshua Pinter
14
@ JoshPinter:coalesce(some_col, '') = ''
Andomar
6
Dies mag irgendwann zutreffen, funktioniert aber in MySQL 14.14 nicht.
Gunnar Þór Magnússon
funktioniert großartig und ist in der Tat die einzige Möglichkeit, herauszufinden, wie man sowohl null als auch leere Felder in MariaDB herausfiltert
Neal Davis
1
Ich benutze some_col <> '', um das Gegenteil davon zu finden
Chargnn
18
Sie können testen , ob eine Spalte null ist oder nicht null verwendet WHERE col IS NULLoder WHERE col IS NOT NULLzB
SELECT myCol
FROM MyTable
WHERE MyCol ISNULL
In Ihrem Beispiel haben Sie verschiedene Permutationen von Leerzeichen. Sie können Leerzeichen mit entfernen TRIMund COALESCEeinen NULL-Wert als Standard festlegen (COALESCE gibt den ersten Wert ungleich Null aus den von Ihnen angegebenen Werten zurück.
z.B
SELECT myCol
FROM MyTable
WHERE TRIM(COALESCE(MyCol,'')=''
Diese letzte Abfrage gibt Zeilen zurück, die MyColnull oder eine beliebige Länge von Leerzeichen sind.
Wenn Sie dies vermeiden können, ist es besser, keine Funktion für eine Spalte in der WHERE-Klausel zu haben, da dies die Verwendung eines Index erschwert. Wenn Sie einfach überprüfen möchten, ob eine Spalte null oder leer ist, sollten Sie dies besser tun:
SELECT myCol
FROM MyTable
WHERE MyCol ISNULLOR MyCol =''
Sie präsentieren die reale Lösung auf sehr komplizierte Weise. Zuerst präsentieren Sie eine unvollständige Lösung für sein Problem "wo mycol null ist". Anschließend präsentieren Sie eine Lösung mit zwei verschachtelten Funktionen in der where-Klausel, auch wenn Sie sagen, dass dies vermieden werden sollte. Erst dann gelangen Sie zur eigentlichen Lösung. Präsentieren Sie in Zukunft zuerst Ihre echte Lösung.
In Ihrem zweiten Beispiel fehlt ein Zeichen )vor dem =Zeichen
Rorrim
15
Eine andere Methode ohne WO, versuchen Sie dies ..
Dies gibt 1 zurück, wenn es etwas Null gibt. Warum ist das so?
Noobie-Php
Das NULLIF überprüft den Feldnamen auf den leeren Wert und konvertiert ihn in NULL, wenn er leer ist. Der ISNULL gibt 1 (true) zurück, wenn der NULLIF ein leeres Feld erfolgreich in NULL geändert hat oder wenn er bereits NULL war. , wählen Sie nullif (y)
PodTech.io
9
Entweder
SELECTIF(field1 ISNULLor field1 ='','empty', field1)as field1 from tablename
oder
SELECTcasewhen field1 ISNULLor field1 =''then'empty'else field1
endas field1 from tablename
Ich hasse unordentliche Felder in meinen Datenbanken. Wenn die Spalte eine leere Zeichenfolge oder eine Null sein könnte, würde ich dies lieber beheben, bevor Sie die Auswahl jedes Mal wie folgt durchführen:
UPDATE MyTable SET MyColumn=NULLWHERE MyColumn='';SELECT*FROM MyTable WHERE MyColumn ISNULL
Dies hält die Daten aufgeräumt, solange Sie aus irgendeinem Grund nicht speziell zwischen NULL und leer unterscheiden müssen.
Beim Überprüfen des null or EmptyWerts für eine Spalte in meinem Projekt habe ich festgestellt, dass in verschiedenen Datenbanken Bedenken hinsichtlich der Unterstützung bestehen.
Jede Datenbank wird nicht unterstützt TRIM Methode.
Nachfolgend finden Sie die Matrix, um die unterstützten Methoden verschiedener Datenbanken zu verstehen.
Die TRIM-Funktion in SQL wird verwendet, um das angegebene Präfix oder Suffix aus einer Zeichenfolge zu entfernen. Das am häufigsten entfernte Muster sind Leerzeichen. Diese Funktion wird in verschiedenen Datenbanken unterschiedlich aufgerufen:
MySQL:TRIM(), RTRIM(), LTRIM()
Orakel:RTRIM(), LTRIM()
SQL Server:RTRIM(), LTRIM()
So überprüfen Sie Leer / Null: -
Im Folgenden finden Sie zwei verschiedene Möglichkeiten für verschiedene Datenbanken.
Die Syntax für diese Trimmfunktionen lautet:
Verwendung von Trim zur Kontrolle
SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL
Verwendung von LTRIM & RTRIM zur Überprüfung von
SELECT FirstName FROM UserDetails WHERE LTRIM(RTRIM(LastName)) IS NULL
Die beiden oben genannten Methoden bieten dasselbe Ergebnis, das nur auf der Grundlage Ihrer Datenbankunterstützung verwendet wird. Es gibt nur die FirstNamefrom- UserDetailsTabelle zurück, wenn sie leer istLastName
Niemals NULLWerte zu akzeptieren , ist ein weiteres Thema. Ich halte es nicht für angebracht, diese Empfehlung ohne Begründung abzugeben.
Maček
Ich habe eingeschlossen, sei geduldig. Plus macht das Leben mit NULL wirklich schwierig (genau wie diese Frage).
Ajreal
5
Das ist eine schreckliche Empfehlung. Das Setzen von NOT NULL für eine Spalte, deren Wert zum Zeitpunkt von INSERT möglicherweise nicht bekannt ist, dient nur dazu, die Verwendung von nicht standardmäßigen "Null" -Werten wie -1und zu fördern ''.
Dan Bechard
@ Dan, wenn Sie nicht sicher sind, was der Wert während des Einfügens ist, können Sie Schwierigkeiten haben, eine mögliche Optimierung
Was bringt es, beide RTRIMund zu verwenden LTRIM, aber nicht TRIM?
Nico Haase
0
In meinem Fall wurde während des Datenimports Platz in die Spalte eingegeben, und obwohl es wie eine leere Spalte aussah, war seine Länge 1. Also habe ich zuerst die Länge der leer aussehenden Spalte überprüft und length(column)dann basierend darauf können wir eine Suchabfrage schreiben
SELECT * FROM TABLE WHERE LENGHT (COLUMN) = Länge der Spalte für leere Spalte
select isnull(mycolumn) from mytable
Gibt 1 zurück, wenn mycolumn null ist.Antworten:
Dadurch werden alle Zeilen auswählen , wo
some_col
istNULL
oder''
(leere Zeichenkette)quelle
WHERE some_col IS NULL OR some_col = ' '
(ein in die Zeichenfolge eingefügtes Leerzeichen) ändern , funktioniert dies sowohl unter MySQL als auch unter Oracle (siehe Antwort von "onedaywhen").some_col = ''
funktioniert unter Oracle nicht, da leere Zeichenfolgen dort NULL bedeuten.' '
, funktioniert es in SQLite nicht. Es werden nur identische / direkte Zeichenfolgenübereinstimmungen verarbeitet.Wie im SQL-92-Standard definiert, wird beim Vergleichen von zwei Zeichenfolgen unterschiedlicher Breite der schmalere Wert mit Leerzeichen rechts aufgefüllt, damit er dieselbe Breite wie der breitere Wert hat. Daher werden alle Zeichenfolgenwerte, die vollständig aus Leerzeichen bestehen (einschließlich Null-Leerzeichen), als gleich angesehen, z
Daher sollte dies unabhängig davon funktionieren, wie viele Leerzeichen den
some_col
Wert ausmachen :oder prägnanter:
quelle
WHERE some_col IS NULL OR some_col = ' '
(ein in die Zeichenfolge eingefügtes Leerzeichen) ändern, dann funktioniert es sowohl unter MySQL als auch unter Oracle.some_col = ''
funktioniert unter Oracle nicht, da leere Zeichenfolgen dort NULL bedeuten und die vollständige Bedingung NULL wird.SELECT * FROM T WHERE some_col IS NOT NULL OR same_col <> ' ';
undSELECT * FROM T WHERE NULLIF(some_col, ' ') IS NOT NULL;
für mich zu arbeiten. Hoffe das wird nützlich sein.'' = ' '
in SQLServer, aber nicht in SQLite, soweit ich das beurteilen kann, nachdem ich es jetzt getestet habe.Ein kürzerer Weg, um die Bedingung zu schreiben:
Schon seit
null > ''
produziertunknown
, hat dies die Wirkung der Filterung beide ausnull
und leeren Saiten.quelle
coalesce(some_col, '') = ''
Sie können testen , ob eine Spalte null ist oder nicht null verwendet
WHERE col IS NULL
oderWHERE col IS NOT NULL
zBIn Ihrem Beispiel haben Sie verschiedene Permutationen von Leerzeichen. Sie können Leerzeichen mit entfernen
TRIM
undCOALESCE
einen NULL-Wert als Standard festlegen (COALESCE gibt den ersten Wert ungleich Null aus den von Ihnen angegebenen Werten zurück.z.B
Diese letzte Abfrage gibt Zeilen zurück, die
MyCol
null oder eine beliebige Länge von Leerzeichen sind.Wenn Sie dies vermeiden können, ist es besser, keine Funktion für eine Spalte in der WHERE-Klausel zu haben, da dies die Verwendung eines Index erschwert. Wenn Sie einfach überprüfen möchten, ob eine Spalte null oder leer ist, sollten Sie dies besser tun:
Weitere Informationen finden Sie unter TRIM COALESCE und IS NULL .
Ebenfalls Arbeiten mit NULL - Werten von der MySQL - Dokumentation
quelle
)
vor dem=
ZeichenEine andere Methode ohne WO, versuchen Sie dies ..
Wählt sowohl leere als auch NULL-Werte aus
quelle
Entweder
oder
quelle
Ich hasse unordentliche Felder in meinen Datenbanken. Wenn die Spalte eine leere Zeichenfolge oder eine Null sein könnte, würde ich dies lieber beheben, bevor Sie die Auswahl jedes Mal wie folgt durchführen:
Dies hält die Daten aufgeräumt, solange Sie aus irgendeinem Grund nicht speziell zwischen NULL und leer unterscheiden müssen.
quelle
Versuchen
oder
Referenz
quelle
Diese Aussage ist für mich viel sauberer und lesbarer:
quelle
Beim Überprüfen des
null or Empty
Werts für eine Spalte in meinem Projekt habe ich festgestellt, dass in verschiedenen Datenbanken Bedenken hinsichtlich der Unterstützung bestehen.Jede Datenbank wird nicht unterstützt
TRIM
Methode.Nachfolgend finden Sie die Matrix, um die unterstützten Methoden verschiedener Datenbanken zu verstehen.
Die TRIM-Funktion in SQL wird verwendet, um das angegebene Präfix oder Suffix aus einer Zeichenfolge zu entfernen. Das am häufigsten entfernte Muster sind Leerzeichen. Diese Funktion wird in verschiedenen Datenbanken unterschiedlich aufgerufen:
TRIM(), RTRIM(), LTRIM()
RTRIM(), LTRIM()
RTRIM(), LTRIM()
So überprüfen Sie Leer / Null: -
Die Syntax für diese Trimmfunktionen lautet:
Verwendung von Trim zur Kontrolle
SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL
Verwendung von LTRIM & RTRIM zur Überprüfung von
SELECT FirstName FROM UserDetails WHERE LTRIM(RTRIM(LastName)) IS NULL
Die beiden oben genannten Methoden bieten dasselbe Ergebnis, das nur auf der Grundlage Ihrer Datenbankunterstützung verwendet wird. Es gibt nur die
FirstName
from-UserDetails
Tabelle zurück, wenn sie leer istLastName
Ich hoffe das hilft dir :)
quelle
Wenn Sie möchten, dass NULL-Werte zuletzt angezeigt werden, wenn Sie ORDER BY ausführen, versuchen Sie Folgendes:
quelle
Sie können auch tun
Das umgekehrte Wesen
quelle
select NULL like ''
kehrt zurückNULL
- zumindest in MySQL.quelle
col1 != IFNULL(col2,'')
Auf null prüfen
Auf leer prüfen
Sie sollten jedoch immer NOT NULL für die Spalte festlegen. Die
MySQL-Optimierung kann nur eine IS NULL-Ebene verarbeiten
quelle
NULL
Werte zu akzeptieren , ist ein weiteres Thema. Ich halte es nicht für angebracht, diese Empfehlung ohne Begründung abzugeben.-1
und zu fördern''
.quelle
RTRIM
und zu verwendenLTRIM
, aber nichtTRIM
?In meinem Fall wurde während des Datenimports Platz in die Spalte eingegeben, und obwohl es wie eine leere Spalte aussah, war seine Länge 1. Also habe ich zuerst die Länge der leer aussehenden Spalte überprüft und
length(column)
dann basierend darauf können wir eine Suchabfrage schreibenquelle
Versuchen Sie dies, wenn der Datentyp Zeichenfolge und Zeile null ist
Wenn der Datentyp int oder die Spalte 0 ist, versuchen Sie dies
quelle
quelle
NULL
.