Difference between (NULL) and empty in mysql column values - mysql

I am working in a company where we use Spring -Hibernate and mysql database at backend.
There is a table tc_wallet
In this table i have an column tips_type which has values
Collection,Payable
'' (empty)
NULL --> No value has been initialized
Now when i fire a query:
SELECT *
FROM `tc_wallet`
WHERE
login_id = 'gaurav.wakharkar'
AND `delete_flag` = 'F'
AND `tips_type` != 'Collection'
I get results which has column value as '' (empty).
Login_id tips_type
gaurav.wakharkar
gaurav.wakharkar
gaurav.wakharkar
But even (NULL) is != 'Collection' should satisfy the above condition.
So according to me the result should have been .
Login_id tips_type
gaurav.wakharkar
gaurav.wakharkar
gaurav.wakharkar
gaurav.wakharkar (NULL)
gaurav.wakharkar (NULL)
Is there some issue while checking/comparing values with (NULL) ?
Does it behave differently ?

To check for nullness, you want to use IS NULL. Comparing NULL to something else with the equality operator (or the inequality operator) is always false.
Consider:
SELECT *
FROM `tc_wallet`
WHERE
login_id = 'gaurav.wakharkar'
AND `delete_flag` = 'F'
AND (`tips_type` IS NULL OR `tips_type` != 'Collection')

change your query to
SELECT
*
FROM
`tc_wallet`
WHERE login_id = 'gaurav.wakharkar'
AND `delete_flag` = 'F'
AND (`tips_type` != 'Collection' or `tips_type` is null)

Related

MYSQL return row

I've a table with records in mysql as below and I would like to get the result, if no value in receivedfmuser and topm then no record (means 0 row) will be displayed, but mysql doesn't work as mysql still count it as 1 row?
select receivedfmuser, topm from tb_postatus where pono = 36 and receivedfmuser is not null and topm is not null
TABLE
|tid|pono|receivedfmuser|topm |
|1 |36 |02/02/2015 | |
|2 |27 |02/03/2015 |02/03/2015|
In your above example, the value in topm in row1 is actually an empty string value and not NULL. That is why it satisfies not null condition and is displaying the record. So, use the following
select receivedfmuser, topm from tb_postatus
where pono = 36 and
receivedfmuser != '' and
topm != ''
This wont display the rows having NULL and also those having an empty string value.
Try below query
select receivedfmuser, topm
from tb_postatus
where pono = 36
and receivedfmuser is not null
and receivedfmuser != ""
and topm is not null
and topm != ""
If in above example the value you are checking for null is topm, then the issue is your query because your query is validating "receivedfmuser" as not null value.
select t.receivedfmuser, t.topm, t.pono
from test t
where `receivedfmuser` IS NOT NULL;
receivedfmuser, topm, pono
'02/02/2015', NULL, '36'
'02/02/2015', '02/03/2015', '27'
Then changing the query to "topm"
select t.receivedfmuser, t.topm, t.pono
from test t
where `topm` IS NOT NULL;
receivedfmuser, topm, pono
'02/02/2015', '02/03/2015', '27'
The result show 1 row the one with topm not null.
With your example :
select t.receivedfmuser, t.topm, t.pono
from test t
where `topm` IS NOT NULL and t.pono = 36;
receivedfmuser, topm, pono
Not result is returned.
Hope this helps.
And yes, if the value you are checking to be null is actually an empty value, your query will not work as mysql will not understand null as an empty string.

mysql-update multiple columns in a single row with multiple where clauses

I have a mysql table as follows:
name | serialno | key
---------------------
NULL | NULL | 10
luke | 1234 | 20
NULL | NULL | 30
NULL | NULL | 40
I have to update a row where the name and the serialno update for a valid key.
The update statements that I am running are as follows:
UPDATE test SET Name = 'pc', Serialno = '10', WHERE `Key` = '10' AND name is null
and
UPDATE test SET Name = CASE
WHEN NULL THEN 'pc'
END
SET Serialno = CASE
WHEN NULL THEN '10'
END
Where `key` = '20'
The following errors get displayed:
1.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE Key = '10' AND name is null' at line 1:
2.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET Serial = CASE
WHEN NULL THEN '10'
END
Where `key`='20'' at line 4:
Please help.
UPDATE test SET Name = CASE Name
WHEN NULL THEN 'pc'
END,
SET Serialno = CASE Serialno
WHEN NULL THEN '10'
END
Where `key` = '20'
You have to specify condition of your CASE
I don't really know what is the context (can you explain the detail what you want and then I will help you with better result).
However, as the StanislavL's answer, the syntax was wrong. I corrected it as below:
UPDATE test SET Name = CASE Name
WHEN NULL THEN 'pc'
END,
Serialno = CASE Serialno
WHEN NULL THEN '10'
END
Where `key` = '20'
Please do like this
UPDATE test SET Name = 'pc', Serialno = '10' WHERE `Key` = '10' AND name is null
Reasons for Errors:
Error 1 was because you have a , comma before WHERE Key = '10' ....
Statement should be:
UPDATE test SET Name = 'pc', Serialno = '10' WHERE `Key` = '10' AND name is null
Error 2 was because you have not instructed which case value to check in when clause. Acceptable syntaxes are:
1. CASE column_name WHEN value THEN expr1 ELSE expr2 END
2. CASE WHEN column_name <condition> value THEN expr1 ELSE expr2 END
Statement should be:
UPDATE test
SET
Name = CASE WHEN name IS NULL THEN 'pc' else name end
, Serialno = CASE WHEN serialno IS NULL THEN '10' else serialno end
END
Where `key` = '10'
Example # SQL Fiddle
You can extend this to set values for columns based on different key values without using where clause.
Example:
UPDATE test
SET
Name = CASE WHEN `key`=10 and name IS NULL THEN 'pc' else name end
, Serialno = CASE WHEN `key`=10 and serialno IS NULL THEN '10' else serialno end
, Name = CASE WHEN `key`=30 and name IS NULL THEN 'key is 30' else name end
, Serialno = CASE WHEN `key`=30 and serialno IS NULL THEN '3' else serialno end
END
Refer to: MySQL: CASE - WHEN syntax

MYSQL IF value = null OR value = ""

I have this part of query:
IF(orders = NULL OR orders = '', "value1', 'value2')
which works with empty cells but not with null ones, any help?
When it's NULL it doesn't make anything but when it's '' it runs the query
It's spelled orders is NULL (not orders = NULL).
You have to use
IF(orders IS NULL OR orders = '', 'value1', 'value2')
instead

MYSQL: enum field searching with NULL values

table person:
name
type enum('admin','user','random') NULL DEFAULT NULL
When this query is performed, it doesnt return the records that have a type of NULL
select * from person where type != 'admin';
null cannot be tested for with (in)equality statements. you need to use IS NULL. e.g.
select *
from person
where (type != 'admin') or (type IS NULL)
e.g. null is "contagious"
null > x -> null
null = x -> null
null = null -> null
null + 1 -> null
null * 1 -> null
etc... it's basically "unknown". Mixing known and unknown in sql makes the result unknown, always. Hence the special ifnull(), coalesce(), and "if null" tests/functions.
You can use the NULL safe equality operator in MySQL
select *
from person
where not type <=> 'admin'

MYSQL Using UPDATE, WHEN THEN with a NULL value

I'm trying to figure out why I'm not getting a result from a MySQL Query I'm running.
I'm trying to replace a NULL value with a number with in a query, but I can't figure out what I'm doing wrong.
Here's my query:
UPDATE Details
SET HowHear_ID = CASE HowHear_ID
WHEN '' THEN 25
WHEN NULL THEN 25
WHEN 7 THEN 25
WHEN 8 THEN 5
WHEN 16 THEN 25
WHEN 17 THEN 16
END
WHERE HowHear_ID IN ('',NULL,7,8,16,17)
This Query will effect all but the NULL values.
What am I doing wrong??
No value will ever equal (or "unequal") NULL in SQL. Understand the following truth table:
NULL = NULL yields NULL -- not FALSE!
NULL != NULL yields NULL -- not TRUE!
[ANY] = NULL yields NULL -- not FALSE!
[ANY] != NULL yields NULL -- not TRUE!
Since the following are equivalent...
[expression] IN (a, b, c)
[expression] = ANY (a, b, c)
[expression] = a OR [expression] = b OR [expression] = c
... you cannot put NULL on the right hand side of an IN predicate. Interestingly, things get even worse when you put NULL on the right hand side of a NOT IN predicate:
[expression] NOT IN (a, b, c)
[expression] != ANY (a, b, c)
[expression] != a AND [expression] != b AND [expression] != c
If b were NULL, the whole expression will become NULL (or maybe FALSE), but never TRUE. This is also the case for NOT IN (subselect) predicates! So, never do this:
[expression] NOT IN (NULL, 1, 2)
The correct solution in your case uses a NULL predicate instead. Do this:
UPDATE Details
SET HowHear_ID = CASE
WHEN HowHear_ID = '' THEN 25
WHEN HowHear_ID IS NULL THEN 25 -- Use a NULL predicate here
WHEN HowHear_ID = 7 THEN 25
WHEN HowHear_ID = 8 THEN 5
WHEN HowHear_ID = 16 THEN 25
WHEN HowHear_ID = 17 THEN 16
END
WHERE HowHear_ID IN ('',7,8,16,17)
OR HowHear_ID IS NULL -- Use a NULL predicate here
Or this:
WHERE COALESCE(HowHear_ID, '') IN ('',7,8,16,17)
You can't reference NULL in a WHERE clause and get the results you expect. NULL behaves differently to other values.
If you need to reference it, you need to use the isnull() function.
in your case, you would write something like this:
WHERE HowHear_ID IN ('',7,8,16,17) or isnull(HowHear_ID)
By the way, you haven't specified the data type of the field. I assume it's an integer though. In that case, it might be better to check for zero rather than an empty string? (if it isn't an integer, then perhaps it should be)
You can achieve that with
WHERE HowHear_ID IN ('',7,8,16,17) OR HowHear_ID IS NULL