Wie kann ich mit einem einzigen Test nach Null- / Leer- / Leerzeichenwerten suchen?

87

Ich möchte eine SELECT-Anweisung schreiben, die nur einen Test verwendet, um Spalten ohne Wert (null, leer oder alle Leerzeichen) zurückzugeben.

Ich dachte das würde funktionieren:

SELECT column_name from table_name WHERE column_name NOT LIKE '%_%';

Dies funktioniert jedoch nicht für NULL-Werte.

Natürlich kann ich hinzufügen

OR column_name IS NULL

und es wird funktionieren, aber ich möchte einen Weg, der einen einzigen Test verwendet.

John Gordon
quelle
1
Siehe auch
OMG Ponys
Ist es nicht wünschenswert, mehrere Tests durchzuführen? dh mehr Granularität = besseres Feedback an die Benutzer zur Korrektur von Daten.
Tag, wenn
@onedaywhen: Im Allgemeinen ist es vielleicht besser, mehr Granularität zu haben, aber ich arbeite mit einer vorhandenen Codebasis und möchte die vorhandene Codestruktur so genau wie möglich nachahmen. Der aktuelle Code führt nur einen Test durch, daher suchte ich nach einer Lösung, die auch nur einen Test hatte.
John Gordon

Antworten:

98

Funktionell sollten Sie in der Lage sein, zu verwenden

SELECT column_name
  FROM table_name
 WHERE TRIM(column_name) IS NULL

Das Problem dort ist, dass ein Index für COLUMN_NAME nicht verwendet wird. Sie benötigen einen funktionsbasierten Index für TRIM (Spaltenname), wenn dies eine selektive Bedingung ist.

Justin Cave
quelle
32
Hinweis für T-SQL-Benutzer: Es gibt kein TRIM, Sie benötigen LTRIM oder RTRIM.
Demoncodemonkey
11
Seit SQL Server 2017 gibt es eine TRIM-Funktion. Quelle
bvwidt
1
@ EhMann365 Diese Frage bezieht sich auf Oracle, nicht auf SQL Server.
MH
11
RTRIM (LTRIM (Spaltenname)) - Für Microsoft SQL-Benutzer.
DxTx
4
In SQL Server gibt TRIM (Spaltenname) eine leere Zeichenfolge '' zurück, nicht NULL. Andere Antworten unterstützen sowohl leere Zeichenfolge als auch NULL
Michael Freidgeim
25
SELECT column_name from table_name
WHERE RTRIM(ISNULL(column_name, '')) LIKE ''

ISNULL(column_name, '') gibt '' zurück, wenn Spaltenname NULL ist, andernfalls wird Spaltenname zurückgegeben.

AKTUALISIEREN

In Oracle können Sie NVLdieselben Ergebnisse erzielen.

SELECT column_name from table_name
WHERE RTRIM(NVL(column_name, '')) LIKE ''
GendoIkari
quelle
3
Tatsächlich funktioniert dies in Oracle immer noch nicht. Oracle behandelt leere Zeichenfolgen als NULL, sodass Sie möglicherweise keine Klausel "nicht wie" haben, da sie mit einem Nullwert verglichen wird
Harrison,
Würde ich nicht LIKE '' anstatt NOT LIKE '' wollen?
John Gordon
Ja, tut mir leid, ich habe die ursprüngliche Frage falsch verstanden, als wollte ich alles, was einen Wert hat. Aber wie Tanging hervorhob, sieht es nicht so aus, als würde dies in Oracle funktionieren.
GendoIkari
Da ich Oracle verwende, kann ich anscheinend WHERE TRIM (col) IS NULL verwenden. Dadurch werden Null-, Leer- und Leerzeichenwerte berücksichtigt.
John Gordon
Offensichtlich fehlt dem ersten Teil eine Klammer, es sollte sein:WHERE RTRIM(ISNULL(column_name, '')) LIKE ''
Serj Sagan
14

Die NULLIF-Funktion konvertiert jeden Spaltenwert mit nur Leerzeichen in einen NULL-Wert. Funktioniert für T-SQL und SQL Server 2008 und höher.

SELECT [column_name]
FROM [table_name]
WHERE NULLIF([column_name], '') IS NULL
MerrickPlainview
quelle
1
Eine gute Antwort würde eine Erklärung des Codes enthalten und warum er so geschrieben wurde. Ich empfehle Ihnen, Ihre Antwort zu aktualisieren :-)
Qirel
1
Was ist der Sinn davon? Es wäre effizienter, es einfach auf [Spaltenname] LIKE ''
SILENT
Es benötigt TRIM, um mehrere Leerzeichen zu unterstützen
Michael Freidgeim
1
Beim Testen unter SQL Server 2017 funktioniert dies für mehrere Leerzeichen ohne TRIM. Für mich macht das keinen Sinn, da NULLIF laut Dokumentation nur dann NULL zurückgeben sollte, wenn die beiden Ausdrücke gleich sind und eine Zeichenfolge normalerweise nicht einer leeren Zeichenfolge entspricht. (Ich habe nur auf Leerzeichen getestet, nicht auf Tabulatoren, Zeilenumbrüche oder andere Leerzeichen.)
Jovie
7

Beim Überprüfen des null or EmptyWerts für eine Spalte habe ich festgestellt, dass in verschiedenen Datenbanken einige Supportprobleme 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: TRIM(), RTRIM(), LTRIM()

So überprüfen Sie Leer / Null / Leerzeichen: -

Im Folgenden finden Sie zwei verschiedene Möglichkeiten für verschiedene Datenbanken.

Die Syntax für diese Trimmfunktionen lautet:

  1. Verwendung von Trim zur Kontrolle

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

  2. 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

Ich hoffe, das hilft auch anderen :)

Vikash Pandey
quelle
WITH t as (wähle '' c union all select '' c union all select NULL) SELECT * FROM t WHERE LTRIM (RTRIM (c)) IST NULL; hat nicht 3 Datensätze auf SQL Server zurückgegeben
Waqar
5
Warum sollte sowohl L & RTRIM benötigt werden? Würde nicht nur eine der Funktionen ausreichen, um zu überprüfen, ob die Spalte leer ist?
SILENT
4

Diese phpMyAdmin-Abfrage gibt die Zeilen zurück, die NICHT null oder leer oder nur Leerzeichen sind:

SELECT * FROM `table_name` WHERE NOT ((`column_name` IS NULL) OR (TRIM(`column_name`) LIKE ''))

Wenn Sie Zeilen auswählen möchten, die null / leer / nur Leerzeichen sind, entfernen Sie einfach NOT.

Wählte
quelle
2

Verwenden Sie die folgende Abfrage und es funktioniert

SELECT column_name FROM table_name where isnull(column_name,'') <> ''
dvenkateshreddy
quelle
0

Was ich IsNotNullOrEmptyOrWhiteSpacein T-SQL verwende, ist:

SELECT [column_name] FROM [table_name]
WHERE LEN(RTRIM(ISNULL([column_name], ''))) > 0
TiltonJH
quelle
0

Jeder Vorschlag einer einzelnen Person, eine Abfrage in Oracle auszuführen, um Datensätze zu finden, deren spezifisches Feld nur leer ist (dies schließt nicht (null) oder ein anderes Feld nur eine leere Zeile ein), funktionierte nicht. Ich habe jeden einzelnen vorgeschlagenen Code ausprobiert. Ich denke, ich werde weiter online suchen.

*****AKTUALISIEREN*****

Ich habe es versucht und es hat funktioniert, nicht sicher, warum es nicht funktionieren würde, wenn <1, aber aus irgendeinem Grund <2 funktioniert und nur Datensätze zurückgegeben, deren Feld nur leer ist

Wählen Sie [Spaltenname] aus [Tabellenname], wobei LÄNGE (Spaltenname) <2;

Ich vermute, dass jedes Skript, das zum Konvertieren von Daten verwendet wurde, etwas im Feld belassen hat, obwohl es leer ist. Das ist sowieso meine Vermutung, warum <2 funktioniert, aber nicht <1

Wenn Sie jedoch andere Werte in diesem Spaltenfeld haben, die weniger als zwei Zeichen umfassen, müssen Sie möglicherweise eine andere Lösung finden. Wenn es nicht viele andere Charaktere gibt, können Sie sie herausgreifen.

Ich hoffe, meine Lösung hilft eines Tages jemand anderem da draußen.

Katzenfrau
quelle
-3

Wie in Oracle können Sie die NVL-Funktion in MySQL verwenden. Sie können IFNULL (columnaName, newValue) verwenden, um das gewünschte Ergebnis wie in diesem Beispiel zu erzielen

SELECT column_name from table_name WHERE IFNULL(column_name,'') NOT LIKE '%_%';
Marina Planells
quelle
-4

Sie können verwenden

SELECT [column_name] 
FROM [table_name]
WHERE [column_name] LIKE '% %' 
OR [column_name] IS NULL
gong15A
quelle