如何查询和比较Oracle 9i中包含分数的字符串

时间:2014-05-01 22:23:39

标签: oracle plsql oracle9i fractions

我被要求使用传统的Oracle 9i数据库并比较用户存储为字符串的小数值。即。某些表字段可能包含“9 7/8”,“3 15/16”等值。

如果不修改数据库,添加程序,索引或任何内容,我如何查询所有值小于“7 4/5”的记录?

像:

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

是否有某种方法可能拆分“”并将第二个值拆分为“/”然后拆分[0] +拆分[1] /拆分[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

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我是通过一些内置功能的扭曲得到的......

SELECT
    "TABLE"."ID",
    "TABLE"."VALUE"
FROM
    "TABLE"
WHERE
(
    SUBSTR(
        VALUE,
        0,
        INSTR(VALUE, ' ')- 1
    ) + SUBSTR(
        VALUE,
        INSTR(VALUE, ' ')+ 1,
        INSTR(VALUE, '/')- INSTR(VALUE, ' ')- 1
    ) / SUBSTR(
        VALUE,
        INSTR(VALUE, '/')+ 1
    ) > 9.5
)

它不优雅,但它运行,这就是我所需要的一切。希望这有助于其他一些不幸的人坚持使用传统的Oracle。

答案 1 :(得分:0)

您要求执行字符串或varchar2作为等式,结果是此等式的值。正确?

这是一个解决方案,我假设空间在&#34; 7 4/5&#34;意味着&#34; 7 + 4/5&#34;或者你必须修改下面的功能以满足你的要求。

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;

以下是此功能的测试:

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