0

我在 informix 中有一个值,如下所示:

value   AMOUNT: <15000000.00> USD

我需要从上面获取 15000000.00。

我正在使用此查询来获取 <> 之间的数据作为解决方法

select substring (value[15,40] 
from 1 for length (value[15,40]) -5  )  
from tablename p where value like 'AMOUNT%';

但是,这不是通用的,因为长度可能会有所不同。

请帮助我对此进行通用查询,获取 <> 之间的数据。

我使用的数据库是 Informix 9.4 版。

4

1 回答 1

1

这是一个恶魔般的问题,由选择打破数据库设计的基本规则之一的人制造:列的内容应该是一个单一的、不可分割的值。

最好的解决方案是修改表以包含 value_descr = "AMOUNT"、value = 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 中没有的任何功能。

于 2013-11-07T07:40:40.680 回答