我在informix中有一个值是这样的:
value AMOUNT: <15000000.00> USD
我需要从上面获取15000000.00。
我正在使用此查询来获取&lt;&gt;之间的数据作为解决方法
select substring (value[15,40]
from 1 for length (value[15,40]) -5 )
from tablename p where value like 'AMOUNT%';
但是,这不是通用的,因为长度可能会有所不同。
请帮我解决此问题,在&lt;&gt;。
之间获取数据我使用的数据库是Informix版本9.4。
答案 0 :(得分:1)
这是一个恶魔般的问题,由任何选择破坏数据库设计基本规则之一的人创建:列的内容应该是单个不可分割的值。
最好的解决方案是修改表以包含value_descr =“AMOUNT”,值= 15000000.00和value_type =“USD”,并确保以这种方式存储传入数据。说起来容易做起来难,我知道。
如果失败了,你将不得不编写一个解析字符串并返回其数字部分的UDR。这在SPL中是可行的,但可能非常慢。有点像:
CREATE PROCEDURE extract_value (inp VARCHAR(255)) RETURNING DECIMAL;
DEFINE s SMALLINT;
DEFINE l SMALLINT;
DEFINE i SMALLINT;
FOR i = 1 TO LENGTH(inp)
IF SUBSTR(inp, i, 1) = "<" THEN
LET s = i + 1;
ELIF SUBSTR(inp, i, 1) = ">" THEN
LET l = i - s - 1;
RETURN SUBSTR(inp, s, l)::DECIMAL;
END IF;
END FOR;
RETURN NULL::DECIMAL; -- could not parse out number
END PROCEDURE;
...你会这样执行:
SELECT extract_value(p.value)
FROM tablename AS p
WHERE p.value LIKE 'AMOUNT%'
注意:该程序在我对版本11.5的有限测试中编译并生成输出。没有进行验证以确保 <>
之间的字符串作为数字进行解析。我没有9.4方便的实例,但我没有使用9.4 TTBOMK中没有的任何功能。