Nested Logic in Persisted Columns Formula - sql

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
)

Related

How to verify if array list is empty in SQL

I have a multilist field returning a list of values.
My query is filtering the list using IN (list), but if the user do not select anything is list, it returns an empty list, or null (I can't see).
I'm trying to do something like:
case when #list is null then 1
when c.SK_dimLocalizacao in (#list) then 1
else 0
end = 1
It works when I select none or one value, but if I select more than one it bring me an error.
I already tried to use:
case when #list = '' then 1
when c.SK_dimLocalizacao in (#list}) then 1
else 0
end = 1
I can't modify the query in backend because i'm using Pentaho.
Maybe this? (not sure if I understand the end goal)
IF LEN(ISNULL(#list,'')) <> 0
BEGIN
--Query for if the list isn't empty or null
END
ELSE
--Query for if the list is empty or null

Nested CASE expression

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)

Null validation in Hive , looking for best approach

I have condition in datastage which verifies 30 columns as not null and assigning value as '0' if anyone of the field is null like below,
isnull(columnA) or isNull(coloumnB) or isnull(columnC) or isNull(coloumnD) then 0 else 1.
we have option to use case statement in hive to set values, however we have to give use CASE statement per column like below,
select
case when (columnA is NULL) then 0
case when (columnB is NULL) then 0
case when (columnC is NULL) then 0
.
.
.
else 1
end as iValidColumn
From tablea
What i am looking?
Trying to look for option where we can validate all the 30 columns in condition for null validation.

How to round this result in SQL SELECT statement

I need a method to round the result returned from the following statement:
CASE
WHEN 0 <> (sod.XDFFLT - sod.DUEQTY)
THEN (sod.XDFFLT - sod.DUEQTY)
ELSE ''
END AS Balance
Which resides in this SELECT statement.
SELECT TOP (10000) som.ORDNUM
,som.NAME
,som.ADDR1
,som.ADDR2
,som.CITY
,som.STATE
,som.ZIPCD
,som.CNTRY
,som.CUSTPO
,COALESCE(cpd.CUSTPRT, sod.PRTNUM) AS CustomerSku
,cpd.CUSTPRT
,som.CUSTID
,sod.PRTNUM
,ps.PMDES1
,sod.CURQTY
,sod.DUEQTY
,sod.XDFFLT
,sod.SHPQTY
,CASE
WHEN 0 <> (sod.XDFFLT - sod.DUEQTY)
THEN (sod.XDFFLT - sod.DUEQTY)
ELSE ''
END AS Balance
,sod.LINNUM + sod.DELNUM AS LineDelNum
,CASE
WHEN 12 <= len(sod.UDFREF)
THEN substring(sod.UDFREF, 9, 4)
ELSE sod.UDFREF
END AS Skid
Replace the CASE with this:
,CASE
WHEN 0 <> (sod.XDFFLT - sod.DUEQTY)
THEN ROUND((sod.XDFFLT - sod.DUEQTY), <number_of_decimals>)
ELSE NULL
END AS Balance
Make sure to replace the <number_of_decimlas> with the appropriate number of decimals you want the number to be rounded to.
greater than 0 will return a number which is rounded on the right side of the comma (decimal point)
less than 0 will return a number which is rounded on the left side of the comma (decimal point)
Also, don't use a blank string in the ELSE clause of your case since this will cause a datatype missmatch and generate an error (a CASE must return a single datatype). Hence, it is better to replace this with NULL, since your first condition will always return a number.

SQL Computer Column Formula

A SQL Table (Trades) has three fields AvgProfit, MinProfit and Hold - Hold is a Computed Colum...
If AvgProfit < MinProfit, Hold = 'Hold' and if AvgProfit > MinProfit, Hold = 'Trade'
The Computed Col formula for Hold is as follows.
SQL Table Trades
AvgProfit varchar(35)
MinProfit varchar(35)
Hold varchar(35)
(case when CONVERT([decimal](8,4),isnull([AvgProfit],(0)),(0))>=CONVERT([decimal](8,4),isnull([MinProfit],(0)),(0)) then 'Trade' else 'Hold' end)
PROBLEM: Updates cause the AvgProfit to be empty at times and this results in an error when the table references the Hold formula
'Error Converting varchar to numeric'
How do I add IS NULL or EMPTY to the above formula, the ISNULL does not catch AvgProfit = '' ??
Consider typing your database with decimal or numeric columns as paxdiablo has suggested. Is there a reason why those columns are set as varchar?
Alternatively if you have to keep your varchar columns, try ISNUMERIC(), http://msdn.microsoft.com/en-us/library/ms186272.aspx. It works with all common SQL numeric types. So you query might become:
ISNUMERIC can be used like this:
select case when ISNUMERIC('123') = 1 then 1 else 0 end ' returns 1
select case when ISNUMERIC('xyz') = 1 then 1 else 0 end ' returns 0
select case when ISNUMERIC(null) = 1 then 1 else 0 end ' returns 0
So your query might become:
case when isnumeric(AvgProfit) = 1 THEN case([AvgProfit] as decimal) else 0 END
Or something similar.
varchar columns should be used for VARiable sized CHARacter columns, not for numeric data.
In other words, they shouldn't be empty (other than NULL, of course, but you've taken care of that).
If you cannot fix that little oversight for some reason, you can make your queries even more complex and slower :-) by doing something like:
select case when xyz = '' then 0 when isnull(xyz) then 0 else xyz end ...
In other words, check for both NULL and empty varchar values.
Myself,I'd fix the schema since it'll be better for you in the long term. I'm merely offering the other solution on the chance that you're not able to do that.