Select ISNULL is not returning replacement value - sql

ContactPerson type is nvarchar.
The issue is when ContactPerson is empty not returning n/a
Query
Select ISNULL(ContactPerson,'n/a') from [dbo].[Suppliers]

An empty string ('') and not the same thing as a null value. ISNULL() returns the replacement value only for an actual null value.
You can use NULLIF() to evaluate an empty string into a null value:
SELECT ISNULL(NULLIF(ContactPerson, ''), 'n/a') ...

I would suggest to use COALESCE instead of ISNULL, with NULLIF function:
SELECT COALESCE(NULLIF(ContactPerson,''),'n/a')
FROM [dbo].[Suppliers]
You can find the difference of COALESCE and ISNULL f.e. here.

Related

How to convert Null to Empty String with SQL

I want to convert Null data to an empty string. How can I do it?
Here is my column screenshot, All of them are null.
Here is my Stored Procedure code;
ISNULL(CustomerStatusId, '') AS StatusId
And here is my website screenshot, all of them are zero.
The problem is that the column has a number type of some sort. You need to convert to a string value, even if the value is NULL:
COALESCE(CAST(CustomerStatusId as VARCHAR(255)), '') AS StatusId
If your column value id 0 then instead of IsNull please use NULLIF and Coalesce(). NULLIF(CustomerStatusId,0) will return null which will be replaced by Coalesce() with ''.
Coalesce(nullif(CustomerStatusId,0), '') AS StatusId

Is it possible to use a COALESCE function inside a SUM function?

I'm trying to use COALESCE function at postgres in a query like this:
SELECT
id_school,
SUM(COALESCE((student->'name'->>'age'), '0')::numeric)
FROM
teachers
GROUP BY 1;
The problem is at line:
SUM(COALESCE((student->'name'->>'age'), '0')::numeric)
I tried to use COALESCE because I'm receiving some empty strings and the ERROR: invalid input syntax for type numeric: ""
Shouldn't COALESCE solve this casting error? Can't I use COALESCE in a SUM function?
You don't actually need the coalesce() function inside the sum, because sum will ignore NULL values anyway.
You error isn't caused by a NULL value, but by an empty string.
So you need to convert the empty string to a NULL value. This can be done using nullif() in Postgres
SELECT id_school,
SUM(nullif(student->'name'->>'age'), '')::numeric)
FROM teachers
GROUP BY 1;
If you could also have strings with blanks in it the JSON value, you might want to consider nullif(trim(student->'name'->>'age'), '')
COALESCE returns first non-null argument. Empty string is non-null. You are trying to cast '' to numeric value.
You can use NULLIF to get null instead of empty string in COALESCE.
SQL Coalesce with empty string

How to query empty string in postgresql?

I have table, in which a column has empty fields.when i try to run simple query like below it is not
returning the data.
select * from table1 where "colunm1" = ''
But below two queries returns data
1,
select * from table1
where coalesce("colunm1", '') = ''
2,
select * from table1
where "colunm1" is null
Can someone tell me the reason?
TIA
You have describe the behavior of a column that is NULL. NULL is not the same as an empty string.
It fails any equality comparison. However, you can use is null or (less preferentially) coalesce().
The only database that treats an empty string like a NULL value, is Oracle.
Logically, for a DBMS, that would be wrong.
Relational DBMSs are all about :
set theory
Boolean algebra
A NULL value is a value that we don't know. A string literal of '' is a string whose value we know. It is a string with no characters, with a length of 0. We don't know of a NULL as a string how long it is, how many and, if any, which, characters it contains.
So it is only logical that:
the comparison '' = '' will evaluate to TRUE
the comparison NULL = NULL will evaluate to FALSE , as any comparison with a NULL value will evaluate to FALSE.
And functions like COALESCE() or NVL(), IFNULL(), ISNULL() will return the first parameter if it does not contain a NULL value. That is consistent.
Except in Oracle

nvl function not returning expected result

I know that nvl function works only for 'null', not empty string. I just wanted to know if there was a function that helps me replace blank/null values with another one.
I used instead:
CASE WHEN expression_1 is null or expression_1 = '' then expression_2 else expression_1
expression_1 column has empty cells, not null cells.
NVL() is a function most typically associated with Oracle. The equivalent standard SQL function is COALESCE().
By default, Oracle treats NULL strings and empty strings ('') as the same. So, '' IS NULL evaluates to "true" (and '' = '' rather confusingly evaluates to NULL, which is false in a WHERE clause).
So, you can use NVL() or COALESCE() on an empty string. These are the same:
NVL(NULL, 'A')
NVL('', 'A')
COALESCE(NULL, 'A')
COALESCE('', 'A')
Here is a db<>fiddle.
Incase the column contains blank spaces, you can use TRIM() besides NVL() so as you can gracefully remove blank spaces before you apply NVL().
NVL(TRIM(' '),'X') --> returns X
db<>fiddle -
https://dbfiddle.uk/?rdbms=oracle_18&fiddle=08435972cbfb799329e6609349c70a04
I believe you are looking Coalesce ():
coalesce(expression2, expression1)
Brings the first non-null value from expression2 else expression 1. If all expressions evaluate to null, then the COALESCE function will return null.
NVL function lets you substitute a value when a null value is encountered:
nvl(expression2, expression1)
Sql statement would replace expression 2 with with expression 1 if it finds null value in there.
Difference: NVL always evaluates both arguments, while COALESCE usually stops evaluation whenever it finds the first non-NULL
One awesome explanation given by #Quassnoi here

Coalesce and Case-When with To_Date not working as expected (Postgres bug?)

I'm using Postgres 9.1. The following query does not work as expected. Coalesce should return the first non-null value. However, this query returns null (1?) instead of the date (2).
select COALESCE(
TO_DATE('','yyyymmdd'), --(1)
TO_DATE('20130201','yyyymmdd') --(2)
);
--(1) this evaluates independently to null
--(2) this evaluates independently to the date,
-- and therefore is the first non-null value
What am I doing wrong? Any workaround?
Edit: This may have nothing to do with Coalesce at all. I tried some experiments with Case When constructs; it turns out, Postgres has this big ugly bug where it treats TO_DATE('','yyyymmdd') as not null, even though selecting it returns null.
[PS: Strike-out above to avoid misleading. Postgres doesn't have a bug, but rather does not treat empty strings as null. See answer.]
SELECT TO_DATE('','yyyymmdd');
doesn't evaluates to NULL since you passing an empty string instead of NULL as an argument to TO_DATE()
This will successfully evaluate to NULL
SELECT TO_DATE(NULL,'yyyymmdd');
If you expect an empty string and want to treat it as a NULL you can use NULLIF()
SELECT TO_DATE(NULLIF(dt, ''),'yyyymmdd')
FROM
(
SELECT CAST('' AS VARCHAR(32)) dt
) q
That being said your sample code that evaluates (1) as NULL
SELECT COALESCE(
TO_DATE(NULLIF('', ''),'yyyymmdd'), --(1)
TO_DATE(NULLIF('20130201',''),'yyyymmdd') --(2)
);
and returns
| COALESCE |
-----------------------------------
| February, 01 2013 00:00:00+0000 |
Here is SQLFiddle demo