查询以获取informix中两个字符之间的数据

时间:2013-11-06 14:25:47

标签: database informix

我在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。

1 个答案:

答案 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中没有的任何功能。