MySQL SELECT nur keine Nullwerte


263

Ist es möglich, eine select-Anweisung auszuführen, die nur NOT NULL-Werte akzeptiert?

Im Moment benutze ich Folgendes:

SELECT * FROM table

Und dann muss ich die Nullwerte mit einer PHP-Schleife herausfiltern.

Gibt es eine Möglichkeit:

SELECT * (that are NOT NULL) FROM table

?

Wenn ich jetzt * auswähle, erhalte ich val1, val2, val3, null, val4, val5, null, null usw., aber ich möchte nur die Werte erhalten, die in meinem Ergebnis nicht null sind. Ist dies ohne Filterung mit einer Schleife möglich?


2
Was möchten Sie tun, wenn es eine Zeile gibt, in der einige Spalten NULL-Werte und andere Spalten keine NULL-Werte haben?
Mark Byers

Ich möchte nur die Werte aus den Spalten abrufen, die nicht null sind, und nur die Spaltenwerte in der Zeile zurückgeben, die nicht null sind. Im Moment benutze ich eine Schleife, um sie herauszufiltern. Ist das ohne Schleife möglich?
Bryan Sammon

1
@bryan - Wie ist Ihre Tabellenstruktur? Haben alle Spalten den gleichen Datentyp?
Martin Smith

1
@bryan - Wie würde Ihre ideale Ergebnismenge dann aussehen? Eine einspaltige Ergebnismenge, die alle Nicht-Null-Werte enthält? Wenn Sie Ihre Frage nicht mit Beispieldaten und gewünschten Ergebnissen bearbeiten, wäre dies hilfreich ...
Martin Smith

2
@bryan - Es hört sich so an, als ob Ihre Tabelle sich wiederholende Gruppen über Spalten hinweg haben könnte. (Eine Erklärung und eine vorgeschlagene alternative Struktur finden Sie im Wiki-Artikel, falls dies der Fall ist. En.wikipedia.org/wiki/First_normal_form )
Martin Smith

Antworten:


451

Sie sollten verwenden IS NOT NULL. (Die Vergleichsoperatoren =und <>beide geben UNKNOWNmit NULLauf beiden Seiten des Ausdrucks an.)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

Der Vollständigkeit halber möchte ich erwähnen, dass Sie in MySQL auch den Null-Safe-Equality-Operator negieren können , dies ist jedoch kein Standard-SQL.

SELECT *
FROM table 
WHERE NOT (YourColumn <=> NULL);

Bearbeitet, um Kommentare wiederzugeben. Es hört sich so an, als ob Ihre Tabelle möglicherweise nicht in der ersten normalen Form vorliegt. In diesem Fall kann das Ändern der Struktur Ihre Aufgabe erleichtern. Ein paar andere Möglichkeiten, es zu tun ...

SELECT val1 AS val
FROM  your_table
WHERE val1 IS NOT NULL
UNION ALL
SELECT val2 
FROM  your_table
WHERE val2 IS NOT NULL
/*And so on for all your columns*/

Der Nachteil des oben genannten ist, dass die Tabelle für jede Spalte mehrmals gescannt wird. Dies kann möglicherweise durch das Folgende vermieden werden, aber ich habe dies nicht in MySQL getestet.

SELECT CASE idx
         WHEN 1 THEN val1
         WHEN 2 THEN val2
       END AS val
FROM   your_table
        /*CROSS JOIN*/
       JOIN (SELECT 1 AS idx
                   UNION ALL
                   SELECT 2) t
HAVING val IS NOT NULL  /*Can reference alias in Having in MySQL*/

2
Vielen Dank .. Es hat geholfen :)
DfrDkn

Im letzten Ansatz haben Sie eine CASEAnweisung verwendet, keine CASEFunktion. Also sollte es nicht END CASEstatt END in dem SELECT CASE ...Teil sein?
Istiaque Ahmed

Können Sie für weniger erfahrene Leute die letzte Lösung erklären? Kommt die idx Rom die erste SELECTvon der idxin der zweiten SELECT? Was versucht die CASEAussage zu erreichen? Was macht der zweite SELECTeigentlich? Und du machst einen inneren Join, keinen Cross-Join, oder?
Istiaque Ahmed

Ich denke nicht, dass dies die Frage beantwortet. Es klang, als wollte OP eine Zeile auswählen (ich nehme eine bestimmte an), aber alle Spalten von diesem Ergebnis ausschließen, die null waren. Bei dieser Antwort müssen Sie entweder angeben, welche Spalten nicht null sein dürfen (was ein völlig anderes Problem ist) oder
Geben Sie

(zB etwas in der Art von SELECT * FROM table WHERE * IS NOT NULL AND primary_key="somevalue")
csey

18

Sie können Zeilen herausfiltern, die einen NULL-Wert in einer bestimmten Spalte enthalten:

SELECT col1, col2, ..., coln
FROM yourtable
WHERE somecolumn IS NOT NULL

Wenn Sie Zeilen herausfiltern möchten, die in einer Spalte eine Null enthalten, versuchen Sie Folgendes:

SELECT col1, col2, ..., coln
FROM yourtable
WHERE col1 IS NOT NULL
AND col2 IS NOT NULL
-- ...
AND coln IS NOT NULL

Update: Basierend auf Ihren Kommentaren möchten Sie dies vielleicht?

SELECT * FROM
(
    SELECT col1 AS col FROM yourtable
    UNION
    SELECT col2 AS col FROM yourtable
    UNION
    -- ...
    UNION
    SELECT coln AS col FROM yourtable
) T1
WHERE col IS NOT NULL

Und ich stimme Martin zu, dass Sie, wenn Sie dies tun müssen, wahrscheinlich Ihr Datenbankdesign ändern sollten.


Ich bin mir nicht sicher, ob ich es gut genug erklärt habe, aber ich werde es ein bisschen besser versuchen. Wenn ich jetzt * auswähle, erhalte ich val1, val2, val3, null, val4, val5, null, null usw., aber ich möchte nur die Werte erhalten, die in meinem Ergebnis nicht null sind. Ist dies ohne Filterung mit einer Schleife möglich?
Bryan Sammon

@bryan - Können Sie erklären, welche Spalten *zurückgegeben werden? Geben Sie möglicherweise einige Beispieldaten in Ihrer Frage an, da aus Ihrem obigen Kommentar nicht hervorgeht, ob dies alles eine Spalte ist.
Martin Smith

Im Moment gibt * alle meine Werte in der Zeile zurück. dh val1, val2, val3, null, val4, val5, null, null. Ich möchte jedoch, dass nur die Spaltenwerte zurückgegeben werden, die nicht null sind. Im Moment mache ich es mit einer Schleife, um die Werte herauszufiltern, nachdem sie das Ergebnis zurückgegeben haben.
Bryan Sammon

13
Select * from your_table 
WHERE col1 and col2 and col3 and col4 and col5 IS NOT NULL;

Der einzige Nachteil dieses Ansatzes ist, dass Sie nur 5 Spalten vergleichen können. Danach ist das Ergebnis immer falsch. Ich vergleiche also nur die Felder, die sein können NULL.


8

Ich habe diese Lösung gefunden:

Diese Abfrage wählt den letzten nicht null Wert für jede Spalte aus.

Beispiel


Wenn Sie einen Tisch haben:

id|title|body
1 |t1   |b1
2 |NULL |b2
3 |t3   |NULL

du erhältst:

title|body
t3   |b2

Abfrage


SELECT DISTINCT (

  SELECT title
  FROM test
  WHERE title IS NOT NULL 
  ORDER BY id DESC 
  LIMIT 1
) title, (

  SELECT body
  FROM test
  WHERE body IS NOT NULL 
  ORDER BY id DESC 
  LIMIT 1
) body
FROM test

Ich hoffe dir zu helfen.


GROUP_CONCAT (Körper) AS Körper
Ravindra Singh

2

Ich benutze den \!Befehl in MySQL, um NULL-Werte aus der Shell herauszuholen:

\! mysql -e "SELECT * FROM table WHERE column = 123456\G" | grep -v NULL

Es funktioniert am besten mit einem richtigen, .my.cnfwo Ihre Datenbank / Benutzername / Passwort angegeben sind. Auf diese Weise müssen Sie nur Ihre selectmit \! mysql eund umgeben | grep -v NULL.


1

Folgende Abfrage arbeitet für mich

wenn ich dann den Standardwert der Spalte 'NULL' gesetzt habe

select * from table where column IS NOT NULL

und wenn ich den Standardwert dann nichts gesetzt habe

select * from table where column <>''

0

Ja, verwenden Sie NOT NULLin Ihrer Anfrage wie folgt.

SELECT * 
FROM table
WHERE col IS NOT NULL;


-4
SELECT * FROM TABLE_NAME
where COLUMN_NAME <> '';

2
Dies ist nicht auswählen, welche leer sind. Frage ist für die Auswahl von nicht Null-Werten
krishna
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.