使用 AS 的虚拟列何时在 SQL 中呈现?
Posted
技术标签:
【中文标题】使用 AS 的虚拟列何时在 SQL 中呈现?【英文标题】:When is a virtual column using AS rendered in SQL? 【发布时间】:2011-11-28 18:13:26 【问题描述】:我不知道如何寻找答案:
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
我得到像 1、2、3...这样的订单 ID...
那么我怎样才能找回那些小于六的呢?返回数据集后,是否对我返回的 regexp_replace 数据进行 where not 操作。甲骨文,如果重要的话。
另外,我相信我的查询会剔除所有前导零并将其替换为空。不确定 \1 是什么意思。是的,我复制了它。我认为它没有放任何东西,这就是我想要的。只需截断前导零。
谢谢。
【问题讨论】:
【参考方案1】:在您的查询中,
where length('new_order_id') < 6
比较文字字符串 'new_order_id'
的长度,而不是字段 new_order_id
的值。
尝试删除引号:
where length(new_order_id) < 6
【讨论】:
@johnny:您可能需要在WHERE
子句中拼出REGEXP_REPLACE(order_id, ...)
。
我不认为它喜欢在 where 子句中替换。【参考方案2】:
试试这个:
select * from
(select orderid
, regexp_replace(orderid,'^0+(.)','\1') new_order_id
from orders)
where length(new_order_id) < 6;
你可以避免使用正则表达式:
select orderid
, ltrim(orderid,'0') new_order_id
from orders
where length(ltrim(orderid,'0'))<6
order by 1;
【讨论】:
感谢您的回答和良好的查询。我让它变得更难了。【参考方案3】:'new_order_id'
字符串的长度永远不会小于 6。如果 oracle 不支持使用不带引号的输出列名(我不知道),您可能不得不使用length(regexp_replace(...)) < 6
。
【讨论】:
以上是关于使用 AS 的虚拟列何时在 SQL 中呈现?的主要内容,如果未能解决你的问题,请参考以下文章