MySQL SELECT only not null values
Asked Answered
D

12

321

Is it possible to do a select statement that takes only NOT NULL values?

Right now I am using this:

SELECT * FROM table

And then I have to filter out the null values with a php loop.

Is there a way to do:

SELECT * (that are NOT NULL) FROM table

?

Right now when I select * I get val1,val2,val3,null,val4,val5,null,null etc.... but I just want to get the values that are not null in my result. Is this possible without filtering with a loop?

Durra answered 12/3, 2011 at 20:58 Comment(9)
What do you want to happen if there is a row where some columns have NULL values and other columns have not NULL values?Lathery
I would like to only get the values from the columns that are not null, and return only the column values in the row that are not null. Right now I use a loop to filter them out, is it possible to do that without a loop?Durra
@bryan - What is your table structure? Do all columns have the same datatype?Barbed
Yes, they are all text value typeDurra
@bryan - So what would your ideal result set look like then? A one column result set containing all the non null values? If not editing your question with example data and desired results would be helpful...Barbed
Yea, I would just like to get all the values that are not null from that row.Durra
Well you could do it with a bunch of UNION ... WHERE coln IS NOT NULL statements but that will scan the table once for each column. MySQL doesn't have an UNPIVOT operator that would help here. So probably the most efficient way would be to do it in your code. The best you can do is exclude rows where all columns are NULL. Are you sure your table stucture is normalised?Barbed
Im not sure about normalized. What is normalized?Durra
@bryan - It sounds like your table may well have repeating groups across columns? (See the Wiki article for an explanation and a suggested alternative structure if that is the case en.wikipedia.org/wiki/First_normal_form)Barbed
B
531

You should use IS NOT NULL. (The comparison operators = and <> both give UNKNOWN with NULL on either side of the expression.)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

Just for completeness I'll mention that in MySQL you can also negate the null safe equality operator but this is not standard SQL.

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

Edited to reflect comments. It sounds like your table may not be in first normal form in which case changing the structure may make your task easier. A couple of other ways of doing it though...

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*/

The disadvantage of the above is that it scans the table multiple times once for each column. That may possibly be avoided by the below but I haven't tested this in MySQL.

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*/
Barbed answered 12/3, 2011 at 21:1 Comment(7)
In the last approach, you used CASE statement, not CASE function. So shouldn't it be END CASE instead of END in the SELECT CASE ... part ?Motorboat
For not-so-expert people, can you explain the last solution ? Does the idx rom the first SELECT come from the idx in the second SELECT ? What does the CASE statement try to accomplish ? What does the second SELECT actually do ? And you are doing an inner join, not a cross join, right ?Motorboat
I don't think this answers the question. It sounded like OP wanted to select (I assume one specific) row but exclude all columns from that result that were null - this answer requires you to either specify which columns aren't allowed to be null (which is a different problem entirely) or specify all columns, unsuitable for tables with many columnsHeptad
(e.g. something along the lines of SELECT * FROM table WHERE * IS NOT NULL AND primary_key="somevalue")Heptad
@Heptad - The question asker accepted this so presumably it answered it sufficiently as far as they are concerned. Feel free to add your own answer or ask a new questionBarbed
I assume that was more because it solved his problem than answered his question, and it sounds like what he wanted isn't possible as succinctly as aboveHeptad
What a nice answer is this, too complete :) - ThanksSauternes
L
25

You can filter out rows that contain a NULL value in a specific column:

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

If you want to filter out rows that contain a null in any column then try this:

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

Update: Based on your comments, perhaps you want this?

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

And I agre with Martin that if you need to do this then you should probably change your database design.

Lathery answered 12/3, 2011 at 21:1 Comment(3)
Im not sure if I explained it well enough, but im gonna try a little better. Right now when I select * I get val1,val2,val3,null,val4,val5,null,null etc.... but I just want to get the values that are not null in my result. Is this possible without filtering with a loop?Durra
@bryan - Could you explain what columns * returns? Maybe provide a bit of example data in your question as it is not clear from your comment above whether this is all one column.Barbed
Right now, * returns all of my values in the row. i.e. val1,val2,val3,null,val4,val5,null,null. But I want it to only return the column values that are not null. Right now I do it with a loop to filter out the values after it returns the result.Durra
O
15
Select * from your_table 
WHERE col1 and col2 and col3 and col4 and col5 IS NOT NULL;

The only disadvantage of this approach is that you can only compare 5 columns, after that the result will always be false, so I do compare only the fields that can be NULL.

Orndorff answered 20/1, 2012 at 19:57 Comment(0)
P
8

I found this solution:

This query select last not null value for each column.

Example


If you have a table:

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

you get:

title|body
t3   |b2

Query


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

I hope help you.

Peregrination answered 3/2, 2012 at 12:22 Comment(1)
GROUP_CONCAT(body) AS bodyRenter
A
5

Following query working for me

when i have set default value of column 'NULL' then

select * from table where column IS NOT NULL

and when i have set default value nothing then

select * from table where column <>''
Auriferous answered 5/8, 2018 at 20:11 Comment(0)
A
2

I use the \! command within MySQL to grep out NULL values from the shell:

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

It works best with a proper .my.cnf where your database/username/password are specified. That way you just have to surround your select with \! mysql e and | grep -v NULL.

Avigation answered 18/1, 2013 at 18:40 Comment(0)
D
2

Yes use NOT NULL in your query like this below.

SELECT * 
FROM table
WHERE col IS NOT NULL;
Directrix answered 30/6, 2017 at 0:0 Comment(0)
A
0

You didn't even have to use an asterisk to get the table fields.

Atalaya answered 18/10, 2023 at 14:42 Comment(0)
R
0

Add condition >0 for int columns and != "" for varchar columns

select column1_id, column2, colummn3, where column1_id>0 and column2 != ""
Radical answered 14/2 at 9:53 Comment(0)
A
-3
SELECT duration,id FROM `tickets` WHERE duration !=""
Abscond answered 28/3, 2021 at 12:17 Comment(0)
L
-3

WHERE COALESCE(ALL YOUR COLUMNS) IS NOT NULL

Leopardi answered 9/9, 2022 at 13:56 Comment(2)
Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.Naraka
Please add an explanation of your code along with a practical, syntactically correct example of a query using it. Examples help readers to more easily see how it can be applied to their situation, and descriptions let readers know if and/or why the answer solves the problem.Sharpeared
T
-7
SELECT * FROM TABLE_NAME
where COLUMN_NAME <> '';
Teleplay answered 31/3, 2016 at 16:20 Comment(2)
This is not select which are empty. question is for selecting not null valuesBiarritz
' ' and null is differentArdy

© 2022 - 2024 — McMap. All rights reserved.