何时使用在SQL中呈现的AS的虚拟列?

时间:2011-11-28 18:13:26

标签: sql regex oracle

我不确定如何搜索答案:

select orderid, REGEXP_REPLACE (
orderid, 
'^0+(.)',
'\1'
) as new_order_id
from orders 
where length('new_order_id') < 6

这不会返回任何内容。但我知道数据存在。如果我这样做:

select orderid, REGEXP_REPLACE (
orderid, 
'^0+(.)',
'\1'
) as new_order_id
from orders 
order by order_id asc

我得到了订单ID,如1,2,3 ......

那么如何才能找回少于六个的?在返回数据集之后,返回的regexp_replace数据上的操作是否无效。 Oracle是否重要。

另外,我相信我的查询会淘汰所有前导零并将其替换为零。不确定\ 1是什么意思。是的,我复制了它。我以为它什么也没放,这就是我想要的。只需截断前导零。

感谢。

3 个答案:

答案 0 :(得分:3)

在您的查询中,

where length('new_order_id') < 6

比较文字字符串'new_order_id'的长度,而不是字段new_order_id的值。

尝试删除引号:

where length(new_order_id) < 6

答案 1 :(得分:2)

试试这个:

select * from
(select orderid
      , regexp_replace(orderid,'^0+(.)','\1') new_order_id
   from orders)
where length(new_order_id) < 6;

您可以避免使用regexp:

select orderid
     , ltrim(orderid,'0') new_order_id
  from orders
 where length(ltrim(orderid,'0'))<6
 order by 1;

答案 2 :(得分:1)

字符串'new_order_id'的长度永远不会小于6.如果oracle不支持使用没有引号的输出列名称,则可能需要执行length(regexp_replace(...)) < 6(我不知道) )。