我被要求使用传统的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
有什么想法吗?
答案 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;