I’m trying to figure out what’s the best approach for this:
If C="WORD": A = 51 if B is between 0 and 2000 A = 102 if B is between 2001 and 8000 A = 204 if B is higher than 8000 AND if D is ticked (checkbox) the A value turns into half`
I need this column to be “persisted”, so that I can use it on reports.
For another column, I’ve used this and works:
ALTER TABLE dbo.mytable ADD C AS (A + B) / CASE D WHEN 1 THEN 4 ELSE 2 END;
Started with the this other code but it’s not working and it still doesn’t have the condition for the checkbox.
ALTER TABLE dbo.tablename ADD FieldA AS (CASE WHEN FieldC = "Word" THEN CASE WHEN FieldB > 0 AND FieldB < =2000 THEN 102 WHEN FieldB > 2000 AND FieldB <= 8000 THEN 204 WHEN FieldB > 8000 THEN 306 ELSE NULL END,
How can I proceed?
Advertisement
Answer
In the short term, Tab is right about your typo.
In the bigger picture, you can save yourself some CPU time by taking advantage of the fact that CASE
conditions are evaluated in order, so if you go backwards you only need to evaluate the last parameter. Also, by using the POWER
trick, you’ll dodge the division by 0
error without having to introduce another CASE
expression.
Alternative included if FieldD is a bit.
The values for FieldA
vary between your problem statement and your code. I used the problem statement. Alter if needed.
ALTER TABLE dbo.tablename ADD FieldA AS ( CASE WHEN FieldC = "Word" THEN CASE WHEN FieldB > 8000 THEN 204 WHEN FieldB > 2000 THEN 102 WHEN FieldB >= 0 THEN 51 ELSE NULL END END / POWER(2,FieldD) --<--- Or, possibly, POWER(2,CAST(FieldD AS tinyint)) )