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?

(e.g. null or '' or '  ' or '      ' and ...)

1
MySQL-Code: select isnull(mycolumn) from mytableGibt 1 zurück, wenn mycolumn null ist.
Eric Leschinski

2
Was ist mit Länge (Trim (Mycolumn))> 0?
Cyril Jacquart

Für MSSQL> WHERE COLUMN <> '' ODER WHERE LEN (COLUMN)> 0 ODER WHERE NULLIF (LTRIM (RTRIM (COLUMN)), '') IST NICHT NULL
DxTx

Antworten:


444

Dadurch werden alle Zeilen auswählen , wo some_colist NULLoder ''(leere Zeichenkette)

SELECT * FROM table WHERE some_col IS NULL OR some_col = '';

7
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

'' = ' ' IS TRUE
'' = '  ' IS TRUE
' ' = '  ' IS TRUE
'  ' = '      ' IS TRUE
etc

Daher sollte dies unabhängig davon funktionieren, wie viele Leerzeichen den some_colWert ausmachen :

SELECT * 
  FROM T
 WHERE some_col IS NULL 
       OR some_col = ' ';

oder prägnanter:

SELECT * 
  FROM T
 WHERE NULLIF(some_col, ' ') IS NULL;

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


2
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 IS NULL 

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 IS NULL OR MyCol =  '' 

Weitere Informationen finden Sie unter TRIM COALESCE und IS NULL .

Ebenfalls Arbeiten mit NULL - Werten von der MySQL - Dokumentation


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

Wählt sowohl leere als auch NULL-Werte aus

SELECT ISNULL(NULLIF(fieldname,''))  FROM tablename

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

SELECT IF(field1 IS NULL or field1 = '', 'empty', field1) as field1 from tablename

oder

SELECT case when field1 IS NULL or field1 = ''
        then 'empty'
        else field1
   end as field1 from tablename

6

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=NULL WHERE MyColumn='';
SELECT * FROM MyTable WHERE MyColumn IS NULL

Dies hält die Daten aufgeräumt, solange Sie aus irgendeinem Grund nicht speziell zwischen NULL und leer unterscheiden müssen.


5

Versuchen

SELECT 0 IS NULL ,  '' IS NULL , NULL IS NULL

-> 0, 0, 1

oder

SELECT ISNULL('  ') , ISNULL( NULL )
 -> 0 ,1

Referenz


5

Diese Aussage ist für mich viel sauberer und lesbarer:

select * from my_table where ISNULL(NULLIF(some_col, ''));

4

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:

  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 dir :)


3

Wenn Sie möchten, dass NULL-Werte zuletzt angezeigt werden, wenn Sie ORDER BY ausführen, versuchen Sie Folgendes:

SELECT * FROM my_table WHERE NULLIF(some_col, '') IS NULL;

3

Sie können auch tun

SELECT * FROM table WHERE column_name LIKE ''

Das umgekehrte Wesen

SELECT * FROM table WHERE column_name NOT LIKE ''

Anscheinend funktioniert nicht: select NULL like ''kehrt zurück NULL- zumindest in MySQL.
Titus

2
SELECT * FROM tbl WHERE trim(IFNULL(col,'')) <> '';

Ich hatte ein Problem im Vergleich zu einem Feld, das manchmal null war. Dies half:col1 != IFNULL(col2,'')
Webaholik

1

Auf null prüfen

$column is null
isnull($column)

Auf leer prüfen

$column != ""

Sie sollten jedoch immer NOT NULL für die Spalte festlegen. Die
MySQL-Optimierung kann nur eine IS NULL-Ebene verarbeiten


3
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
durchzuführen

0
select * from table where length(RTRIM(LTRIM(column_name))) > 0

1
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


-1

Versuchen Sie dies, wenn der Datentyp Zeichenfolge und Zeile null ist

SELECT * FROM table WHERE column_name IS NULL OR column_name = ''

Wenn der Datentyp int oder die Spalte 0 ist, versuchen Sie dies

SELECT * FROM table WHERE column_name > = 0

-2
SELECT column_name FROM table_name WHERE column_name IN (NULL, '')

1
Falsche Antwort. Dies wird nicht ausgewählt NULL.
Pang
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.