I need to implement a logic in either Java OR SQL for the following.
There are credit ratings from numbers 1 to 11. And corresponding to each rating say x, I have 3 grades, effectively :x+, x and x-. Difference between each grade is termed as a step. For example, 2 and 2- is single(1) step,2+ and 2- is double(2) step, and 2- and 3+ is again a single(1) step.
My objective is to programmatically find out the number of steps between two credit rating values, until the difference in number of steps is 3.
I tried to solve this problem using conditional (if-else/case) statements, but a deeper analysis led to the conclusion that this would require about 50 odd such statements, which is not a very efficient thing to do, at least in terms of code layout.
Is there any other way to get the number of steps? Perhaps using a temporary data structure, and then using that for lookup?
Note: I can have the two credit rating values pulled into Java Code from DB and then compute number of steps. Alternatively, I need to create a database object(like procedure, function) and then have the number of steps computed that way, such that my Java code can directly consume it.
Advertisement
Answer
I would just assign a numeric value to each rating and have a function that subtracts one from the other.
create or replace package rating
as
function diff(r1 varchar2, r2 varchar2)
return integer
deterministic
parallel_enable;
end rating;
/
create or replace package body rating
as
type rating_tab is table of simple_integer index by varchar2(3);
ratings rating_tab;
function diff(r1 varchar2, r2 varchar2)
return integer
deterministic
parallel_enable
is
pragma udf;
begin
return ratings(r2) - ratings(r1);
end diff;
begin
ratings('1+') := 1;
ratings('1+') := 2;
ratings('1') := 3;
ratings('1-') := 4;
ratings('2+') := 5;
ratings('2') := 6;
ratings('2-') := 7;
ratings('3+') := 8;
ratings('3') := 9;
ratings('3-') := 10;
ratings('4+') := 11;
ratings('4') := 12;
ratings('4-') := 14;
ratings('5+') := 15;
ratings('5') := 16;
ratings('5-') := 17;
ratings('6+') := 18;
ratings('6') := 19;
ratings('6-') := 20;
ratings('7+') := 21;
ratings('7') := 22;
ratings('7-') := 23;
ratings('8+') := 24;
ratings('8') := 25;
ratings('8-') := 26;
ratings('9+') := 27;
ratings('9') := 28;
ratings('9-') := 29;
ratings('10+') := 30;
ratings('10') := 31;
ratings('10-') := 32;
ratings('11+') := 33;
ratings('11') := 34;
ratings('11-') := 35;
end rating;
/
select rating.diff('1-', '3+') as steps from dual;
STEPS
---------
4
I am not sure whether a PL/SQL function is acceptable though, since you started by saying you wanted to use either Java or SQL.