It is not clear what you are asking.
Can you talk a little about what should look like a result set, do you want to return all 10 columns, but include only rows containing at least one column containing NULL or 0? This is very easy to do by specifying the appropriate predicates in the WHERE clause.
SELECT col0, col1, col2, col3, col4, col5, col6, col7, col8, col9 FROM mytable WHERE IFNULL(col0,0) = 0 OR IFNULL(col1,0) = 0 OR IFNULL(col2,0) = 0 OR IFNULL(col3,0) = 0 OR IFNULL(col4,0) = 0 OR IFNULL(col5,0) = 0 OR IFNULL(col6,0) = 0 OR IFNULL(col7,0) = 0 OR IFNULL(col8,0) = 0 OR IFNULL(col9,0) = 0
This will return all rows with null or null in at least one of the specified columns.
But your question seems to be asking about something a little different; you seem to be asking about the return of only certain columns based on conditions. The columns returned to the result set are determined by the list of expressions following the SELECT keyword. You cannot dynamically change expressions in a SELECT list based on the values contained in a column.
To return the names of columns that have at least one row containing NULL or zero in this column, you can write such a query (this is limited to 5 columns, you can easily expand to 10 or more columns):
SELECT 'col0' AS col_name FROM mytable WHERE IFNULL(col0,0) = 0 UNION SELECT 'col1' FROM mytable WHERE IFNULL(col1,0) = 0 UNION SELECT 'col2' FROM mytable WHERE IFNULL(col2,0) = 0 UNION SELECT 'col3' FROM mytable WHERE IFNULL(col3,0) = 0 UNION SELECT 'col4' FROM mytable WHERE IFNULL(col4,0) = 0
(This query will perform a serious scan through the table. If indexes are available, predicates can be rewritten to allow index range scanning.)
Here is the path to columns_name in one row. (NULL in one of the columns means that the column does not contain zeros or NULL.)
SELECT (SELECT 'col0' FROM mytable WHERE IFNULL(col0,0)=0 LIMIT 1) AS col0 , (SELECT 'col1' FROM mytable WHERE IFNULL(col1,0)=0 LIMIT 1) AS col1 , (SELECT 'col2' FROM mytable WHERE IFNULL(col2,0)=0 LIMIT 1) AS col2 , (SELECT 'col3' FROM mytable WHERE IFNULL(col3,0)=0 LIMIT 1) AS col3 , (SELECT 'col4' FROM mytable WHERE IFNULL(col4,0)=0 LIMIT 1) AS col4
But it would be much faster to perform one scan in the table:
SELECT IF(c0>0,'col0',NULL) , IF(c1>0,'col1',NULL) , IF(c2>0,'col2',NULL) , IF(c3>0,'col3',NULL) , IF(c4>0,'col4',NULL) FROM ( SELECT SUM(IF(IFNULL(col0,0)=0,1,0)) AS c0 , SUM(IF(IFNULL(col1,0)=0,1,0)) AS c1 , SUM(IF(IFNULL(col2,0)=0,1,0)) AS c2 , SUM(IF(IFNULL(col3,0)=0,1,0)) AS c3 , SUM(IF(IFNULL(col3,0)=0,1,0)) AS c4 FROM mytable )