使用 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(...)) &lt; 6

【讨论】:

以上是关于使用 AS 的虚拟列何时在 SQL 中呈现?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 10G 中的更改表 - 虚拟列

Rails 虚拟属性搜索或 sql 组合列搜索

Mysql 5.7新特性: JSON字段、虚拟列、视图

SQL 基础面试题01☆☆☆_分组统计等怎么加虚拟列1班和2班相差的分数怎么用sql计算

MySQL虚拟列及json优化

Oracle 用虚拟列创建表