Search code examples
oracle-databaseplsqloracle9ifractions

How to query and compare strings containing fractions in Oracle 9i


I have been asked to work with a legacy Oracle 9i DB and compare fractional values which users have stored as strings. ie. some table field may contain values like "9 7/8", "3 15/16" etc.

Without modifying the DB, adding procedures, indexes or anything how could I query for all the records who's value is less than "7 4/5"?

Like:

SELECT * FROM `ANNOYING_TABLE` WHERE FRACTIONAL_STRING_TO_DECIMAL(`fractional_data`) < 7.8

Is there some way to perhaps split on the " " and the split the second value on "/" and then do split[0]+split[1]/split[2]

SELECT * FROM `ANNOYING_TABLE`, FIRST_SPLIT = SPLIT(`fractional_data`," "), SECOND_SPLIT = SPLIT( FIRST_SPLIT[1], "/" ) WHERE (FIRST_SPLIT[0]+(SECOND_SPLIT[0] / SECOND_SPLIT[1])) < 7.8

Any ideas?


Solution

  • you are asking to execute a string or varchar2 as equation, the result is a value of this equation. right?

    here is a solution for this, I assume the space in "7 4/5" means "7+ 4/5" or you have to modify the function bellow to meet your requirements.

    create or replace function get_equation_val( p_equation varchar2) return number is
      eq        varchar2(500);
      eq_stmt   varchar2(500);
      eq_result number;
    begin
    
      eq      := replace(p_equation, ' ', '+');
      eq_stmt := 'select ' || eq || ' from dual';
      execute immediate eq_stmt
        into eq_result;
     -- dbms_output.put_line(eq_result);
     return(eq_result);
    end get_equation_val;
    

    and here is a test for this function:

    select get_equation_val('7 4/5') from dual;