MySQL SELECT nur ungültige Werte

Ist es möglich, eine Select-Anweisung, die nur NOT NULL-Werte nimmt zu tun?

Im Moment verwende ich dies:

SELECT * FROM table

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

Gibt es eine Möglichkeit zu tun:

SELECT * (that are NOT NULL) FROM table

?

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

Lösung

Sie sollten IS NOT NULL verwenden. (Die Vergleichsoperatoren = und `ergeben beideUNKNOWNmitNULL` auf beiden Seiten des Ausdrucks.)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

Nur der Vollständigkeit halber möchte ich erwähnen, dass man in MySQL auch den nullsicheren Gleichheitsoperator negieren kann, aber das ist kein Standard-SQL.

SELECT *
FROM table 
WHERE NOT (YourColumn  NULL);

Bearbeitet, um Kommentare zu berücksichtigen. Es hört sich so an, als ob Ihre Tabelle nicht in der ersten Normalform ist. In diesem Fall könnte eine Änderung der Struktur Ihre Aufgabe erleichtern. Es gibt aber auch ein paar andere Möglichkeiten...

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 der obigen Methode ist, dass die Tabelle mehrfach gescannt wird, einmal für jede Spalte. Das kann möglicherweise durch die folgende Methode vermieden werden, aber ich habe sie 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*/
Kommentare (7)

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 wollen, die in einer beliebigen Spalte einen Nullwert enthalten, versuchen Sie dies:

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

Update: Nach Ihren Kommentaren zu urteilen, wollen Sie das 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 mit Martin überein, dass Sie, wenn Sie dies tun müssen, wahrscheinlich Ihr Datenbankdesign ändern sollten.

Kommentare (3)
Select * from your_table 
WHERE col1 and col2 and col3 and col4 and col5 IS NOT NULL;

Der einzige Nachteil dieses Ansatzes ist, dass man nur 5 Spalten vergleichen kann, danach wird das Ergebnis immer falsch sein, also vergleiche ich nur die Felder, die NULL sein können.

Kommentare (0)