简体   繁体   中英

mysql returns null when asking for difference between some value and null

in my table i have 3 column id, somevalue (float), current timestamp

code below searches for the latest value in today's date and subtracts that with the value on monday of the same week. but i dont have any value stored for monday in this week so its NULL at the moment. but result of below code should be some value not null ???? dont understand how is it possible. pls explain.

select(SELECT power FROM newdb.newmeter
where date(dt)=curdate() order by dt desc limit 1)-
(select Power from newdb.newmeter
where date(dt)=(select date(subdate(now(), interval weekday(now()) day))));

as i was reading the similar questions-answers it looks like anything you do with null in mysql is null is it true?? if yes how do i resolve this

update: i tried this but didnt work select sum(amount) - coalesce(sum(due),0)

just wanted to add something more to this i'm calling querydb as following for the mysql in c++

bool Querydb(char *query, double Myarray[1024])
{
   //snip//

    if (mysql_query(conn, query)) {
    fprintf(stderr, "%s\n", mysql_error(conn));
    return 0;
    }

    else {
    res = mysql_use_result(conn);
    //output table name
    //printf("MySQL Tables in mysql database:\n");

    //checking for null value in database
    while((row = mysql_fetch_row(res))==NULL){
        printf("ERROR_____NULL VALUE IN DATABASE  ");
        return 0;
    }

    //if not null then ...
    while ((row = mysql_fetch_row(res)) != NULL){
        printf("rows fetched %s\n", row[0]);
        sprintf(buffer,"%s",row[0]);
       value1 = atof(buffer);
        Myarray[i]=value1;
        //printf("Myarray in sql for daybutton = %f\n",Myarray[i]);
        i++;
        }
    i=0;
    //for(i=0;i<5;i++){
    //    printf("mya arr in sqlfunction = %f\n",Myarray[i]);}
    return 1;
    }
    printf("if here then....where??\n");

   //close connection
   // mysql_free_result(res);
   //return 0;
}

the above function works ok with different query when database has null but doesnt work with this query

  select(SELECT power FROM newdb.newmeter
    where date(dt)=curdate() order by dt desc limit 1)-
    (select Power from newdb.newmeter
    where date(dt)=(select date(subdate(now(), interval weekday(now()) day))));

it returns 1 even thought the answer is NULL...

Consult the manual on working with NULL values. They are treated specially http://dev.mysql.com/doc/refman/5.0/en/working-with-null.html

What value would you want it to be? This isn't particularly specific to MySQL - operations involving null operands (including comparisons) have null results in most SQL dialects.

You may want to use COALESCE() to provide a "default" value which is used when your real target value is null.

work Around would be

select(SELECT power FROM newdb.newmeter
where date(dt)=curdate() order by dt desc limit 1)-
(select COALESCE(Power,0) from newdb.newmeter
where date(dt)=(select date(subdate(now(), interval weekday(now()) day))));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM