【问题标题】:Wants numeric data from varchar2 datatype column想要来自 varchar2 数据类型列的数字数据
【发布时间】:2012-05-09 05:14:07
【问题描述】:

我有一个表Product,其列名Value 的varchar2 数据类型,在此列中的值存储为

All,10:23,0.84522,1.245,10:54:68,
All,1:22:00,0.245,45:12:00 

等等。

我们必须提取所有浮动值,例如 (0.84522,1.245,0.245) 和以“:00”结尾的值,例如 (1:22:00,45:12:00)。

我有以下查询,但它似乎不起作用;它给了我除了字符之外的所有值。

select * from Product where Values BETWEEN to_char (0) and to_char (2);

【问题讨论】:

  • 请将您的数据作为表格发送。“值”字段的数据让我感到困惑。
  • 列被设计用来保存谨慎的值。当您将列表放入单个列中时,这会让生活变得艰难。对你来说很难,对 DBMS 也很难。重新设计您的架构。
  • @JonathanLeffler 感谢您的意见,我知道,但在某些情况下您必须处理此类事情。如果您有任何建议,请与我分享。谢谢

标签: sql oracle


【解决方案1】:

我认为这可行

select *
FROM  Product 
WHERE  
(Value LIKE '%:00' AND Value<>  'ALL') AND (Value BETWEEN  to_NUMBER (0) and to_NUMBER (2))

【讨论】:

  • 在与数字范围比较时需要使用 to 编号,因为值可能会因字符值而异
  • 嗨,当我执行此查询时,它没有给我任何结果,我对其进行了编辑并仅包含 to_Number 和部分,它给了我错误,无效号码。谢谢。
【解决方案2】:

试试这个查询:

select *
  from (select distinct regexp_substr(t.value, '[^,]+', 1, level) phrase
          from Product t
        connect by regexp_substr(t.value, '[^,]+', 1, level) is not null) ph
 where regexp_like(ph.phrase, '(\d+\.\d+)|(.+:00)')

where 子句中的正则表达式可能需要一些调整

它的作用是-

  1. 分隔所有短语(内部查询)
  2. 仅选择符合您条件的那些

更新
如果您遇到性能问题,您可以尝试不同的方法:

create or replace type phrase_typ is object
(
  phrase varchar2(100)
)
;
/
create or replace type phrase_tab as table of phrase_typ;
/
create or replace function split_string(del in varchar2) return phrase_tab
  pipelined is

  phrase  varchar2(1000);
  str_t   varchar2(1000);
  v_del_i number;

  cursor c is with t as
    select value from product;

begin

  for r in c loop
    str_t := r.value;

    while str_t is not null loop

      v_del_i := instr(str_t, del, 1, 1);

      if v_del_i = 0 then
        phrase := str_t;
        str_t  := '';
      else
        phrase := substr(str_t, 1, v_del_i - 1);
        str_t  := substr(str_t, v_del_i + 1);
      end if;

      if regexp_like(phrase, '(\d+\.\d+)|(.+:00)') then
        pipe row(phrase_typ(phrase));
      end if;

    end loop;

  end loop;

  return;
end split_string;
/

现在您的查询应该如下所示:

select * from table(split_string(','))

【讨论】:

  • 你好,这个查询没有执行,它正在加载没有结果:(
  • 你的意思是这需要很多时间吗?如果有,你有多少条记录?
  • 好吧,带有 regexp_substr 的 connect by 有点重。添加了不同的解决方案,使用 piplined function
猜你喜欢
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
  • 2019-06-03
相关资源
最近更新 更多