Nested CASE expression - sql

I have two radio buttons in UI, and column of that radio buttons in table is nullable, in getbyid stored procedure first I want to check if column is null then return null, if it is not null then check if it is zero(No) then return zero or if it is 1(YES) then return one, I think I have to use nested CASE statement for this but can't figure out actual statement, any help please? I have tried the following:
CASE WHEN TMC.CUSTOMER_ID IS NOT NULL THEN(CASE TMC.CUSTOMER_ID WHEN 0 THEN 0
ELSE 1)
ELSE NULL END AS CustomerId,

the END from the second CASE is missing
CASE
WHEN TMC.CUSTOMER_ID IS NOT NULL
THEN
CASE TMC.CUSTOMER_ID WHEN 0 THEN 0 ELSE 1 END
ELSE NULL
END AS CustomerId,
you can achieve the same result with the SIGN function
SIGN(TMC.CUSTOMER_ID) AS CustomerId
or with ABS and SIGN if the customerId could be negative
SIGN(ABS(TMC.CUSTOMER_ID)) AS CustomerId

CASE
WHEN TMC.CUSTOMER_ID IS NOT NULL THEN
CASE WHEN TMC.CUSTOMER_ID=0 THEN 0 ELSE 1 END
END as type_pre,

Use Oracle function decode with null value as default:
decode( TMC.CUSTOMER_ID, 0, 0, 1, 1, null)

Related

Two conditions failure in teradata case - NOT NULL AND NOT 0

Trying to return a column, giving 1, when column1 is NOT NULL and different than 0. So far managed to do this:
MAX(CASE WHEN column1 IS NOT NULL
THEN CASE WHEN column1 <> 0 THEN 1 ELSE 0 END
ELSE 0 END)
Getting this error:
SELECT Failed. 2620: The format or data contains a bad character.
It works quite ok with NOT NULL as a single condition, though.
I'm not sure why you need to nest anything, but it looks like you're missing the non-equality sign.
You might try,
CASE
WHEN column1 IS NOT NULL AND column1 <> 0
THEN 1
ELSE 0
END
Alternatively, this will produce the same result as an OR operator, where, but CASE executes the WHEN clauses in order.
CASE
WHEN column1 IS NOT NULL
THEN 1
WHEN column1 <> 0
THEN 1
ELSE 0
END
But in your description, it sounds like you wanted BOTH conditions to be true, so it doesn't make sense to nest or use multiple WHEN statements, because you can just connect them together with AND

Returning ISNULL of SUM with CASE for selecting options

I want to return the sum of the values of one column when other column (in the same row speaking) is true. But, I canĀ“t achieve...
I am trying the next ones, but no one looks to be correct.
Can I get a pinch of help here? Thanks mates.
ISNULL(SUM(CASE WHEN dbo.TD_MODULO.FIELD1== true THEN dbo.TD_MODULO.FIELD2 ELSE 0 end),0) AS MY_CALCULATED_FIELD1
isnull(sum(if dbo.td_modulo.FIELD1 == true, dbo.td_modulo.FIELD2, 0), 0) as MY_CALCULATED_FIELD2
ISNULL(SUM(CASE dbo.TD_MODULO.FIELD1 WHEN THEN dbo.TD_MODULO.FIELD2 ELSE 0 end),0) AS MY_CALCULATED_FIELD1
Is FIELD1 a bit (boolean) field ?, then compare it to 1 or 0
select sum(case when FIELD1 = 1 then FIELD2 else 0 end) AS MY_CALCULATED_FIELD1
from dbo.TD_MODULO
dbo.TD_MODULO.FIELD1 == true this raises an eyebrow. There is no boolean values in SQL Server so you can't simply write true or false (if a literal then 'true' or 'false', if a BIT then 1 or 0), and you need just one equal sign.
The correct expression is a SUM with a CASE. Assuming that TD_MODULO.FIELD1 is a VARCHAR.
SUM(CASE WHEN dbo.TD_MODULO.FIELD1 = 'true' THEN dbo.TD_MODULO.FIELD2 END)
You can stack an ISNULL on top of it. No need to do an ELSE 0, as NULL (ELSE's default) won't be added on SUM().

CASE logic when removing NULLs

This is my first post, and I attempted to do a thorough search for this issue, so please accept my apologies if it has been posted elsewhere many times, but I'm wondering if anyone has encountered the following issue when attempting to remove NULLs from their result set:
case Occurrence
when NULL then '0'
else occurrence
end as Occurrence,
case Aggregate
when NULL then '0'
else Aggregate
end as Aggregate,
This didn't do anything to my NULLs; however, this did the trick:
case
when occurrence is NULL then '0'
else occurrence
end as Occurrence,
case
when aggregate is NULL then '0'
else Aggregate
end as Aggregate
Does anyone have any idea why this behaves this way? I'm using SQLServer2012.
I'm also not very versed in programming and only have less than a year SQL experience.
Thanks!
You should be using the ISNULL() or COALESCE() system function for handling nulls
something like
SELECT ISNULL(Occurrence , 0) AS Occurrence
,ISNULL(Aggregate , 0) AS Aggregate
FROM Table
OR
SELECT COALESCE(Occurrence , 0) AS Occurrence
,COALESCE(Aggregate , 0) AS Aggregate
FROM Table
The reason it didn't work in the case statement with
case Occurrence
when NULL then '0'
else occurrence
end as Occurrence,
is because it is interpreting it as
CASE
WHEN Occurrence = NULL THEN 0
ELSE Occurrence
END
Null is checked in sql server using IS NULL or IS NOT NULL if you use any other operator with null like = , <> or <, < it yields NULL hence the unexpected results.
Only for SQL Server 2012 and Later
In sql server 2012 and later versions you also have the IIF function
SELECT IIF(Occurrence IS NULL, 0, Occurrence) AS Occurrence
,IFF(Aggregate IS NULL , 0, Aggregate) AS Aggregate
FROM Table
You use simple case:
The simple CASE expression operates by comparing the first expression to the expression in each WHEN clause for equivalency. If these expressions are equivalent, the expression in the THEN clause will be returned.
Allows only an equality check.
case Occurrence
when NULL then '0'
else occurrence
end as Occurrence,
Which is executed as :
case
when occurence = NULL then '0'
else occurrence
end as Occurrence
Then expression occurence = NULL return NULL and is treated like False
Second your case use searched CASE with full condition and works fine:
case
when occurrence IS NULL then '0'
else occurrence
end as Occurrence,
So your question is about difference column IS NULL vs column = NULL
try
select 1 where null =null
select 1 where null is null
your statement looks like null equals null
select case when null is null then 1 else 0 end
select case null when null then 1 else 0 end
In your case use ISNULL this will give you the results your after
SELECT ISNULL(null,1)

CASE WHEN NULL makes wrong result in SQLite?

I have a table with a column of image type, the table has some rows but all the rows haven't had any image yet, they are all null. To test the CASE WHEN NULL, I've tried this and it gave a strange result:
SELECT CASE myImageColumn WHEN NULL THEN 0 ELSE 1 END FROM myTable
All the returned rows were in a column of 1's (I thought 0's). What is wrong here?
Your help would be highly appreciated!
Thank you!
You can't compare with NULL like that, you should try:
SELECT CASE WHEN myImageColumn IS NULL THEN 0 ELSE 1 END
FROM myTable
Use a different form of CASE instead:
SELECT CASE WHEN myImageColumn IS NULL THEN 0 ELSE 1 END FROM myTable
Two useful links:
http://www.sqlite.org/nulls.html
http://www.sqlite.org/lang_expr.html
There's a bypass:
CASE ifnull(myValue, 'someUniqueStringOrValue')
WHEN 'someUniqueStringOrValue' THEN 0 -- this means null
WHEN 'someNormalValue' THEN 1
END

Nested Logic in Persisted Columns Formula

I'm new to and having trouble with Formulae Syntax in Persisted Columns.
A - I need case when (CustomerAccountID IS NULL and MissCustNameMatched=0) OR errLicensingProgMissing=1 OR errLicensingSubMissing=1 then (1) else (0) end
This won't validate correctly.
B - Or can I do it somehow like this *
case
when [MissCustName] IS true then
when [CustomerAccountName] IS NULL then
(1)
else
(0)
end
else
(0)
end*
Your two cases don't match on column names but following persisted field declaration shows how it could be done using a CASE statement.
CREATE TABLE dbo.Test (
CustomerAccountID INTEGER
, MissCustNameMatched INTEGER
, errLicensingProgMissing INTEGER
, errLicensingSubMissing INTEGER
, persistedField AS
CASE MissCustNameMatched WHEN 1
THEN
CASE CustomerAccountID WHEN 1
THEN 1
ELSE 0
END
ELSE 0
END PERSISTED
)