Oracle:to_number() 在 WHERE 子句中结合 substr() 和 regexp_like()

Posted

技术标签:

【中文标题】Oracle:to_number() 在 WHERE 子句中结合 substr() 和 regexp_like()【英文标题】:Oracle: to_number() combined with substr() and regexp_like() in WHERE clause 【发布时间】:2016-10-27 13:52:29 【问题描述】:

我有一个包含“描述”列的表格,其中包含以下值:

OPTestMachine OPManualTesting OP1010

因此,获取值的 select 语句将是

SELECT description
  FROM operation;

我想提取数字“1010”(或任何与 substr() 条件匹配的字符串)并尽可能将“找到的字符串”转换为整数。

所以我想出了这个:

SELECT to_number(substr(description, 3, 4))
  FROM operation
 WHERE regexp_like(substr(description, 3, 4), '^\d+(\.\d+)?$', '')

结果很简单:“1010”

这对我来说效果很好。

现在对我来说最困难的部分:我想在 WHERE 子句中使用 substr()-result

类似这样的:

 SELECT to_number(substr(description, 3, 4))
   FROM operation
  WHERE regexp_like(substr(description, 3, 4), '^\d+(\.\d+)?$', '')
    AND substr(description, 3, 4) < 2000;

当我这样做时,我收到错误“无效号码”。我想这是因为服务器解析 select 语句的顺序。

如果您能提供任何帮助,那就太好了!

【问题讨论】:

【参考方案1】:

substr 函数返回一个字符串,您必须像在 select 语句中那样将其显式转换为数字: AND to_number(substr(description, 3, 4)) &lt; 2000;

【讨论】:

对不起,我已经尝试过了,它返回相同的错误“无效号码” 我的预感是子字符串返回的不是数字,它会导致它崩溃。如果遇到空格,请尝试修剪它:AND to_number(ltrim(rtrim(substr(description, 3, 4)))) &lt; 2000; 是的,你是对的!带有修剪的第二个解决方案有效! @rwur trim() 是一个很好的解决方案,但我不确定你是否可以依赖条件检查的顺序。所以也许添加另一个查询更安全。【参考方案2】:
 SELECT to_number(substr(description, 3, 4))
   FROM operation
  WHERE regexp_like(substr(description, 3, 4), '^\d+(\.\d+)?$', '')
    AND to_number(substr(description, 3, 4)) < 2000;

第二个 to_number 有帮助吗?

如果不是我会这样做:

select to_number(x) from (
SELECT substr(description, 3, 4) x
       FROM operation
      WHERE regexp_like(substr(description, 3, 4), '^\d+(\.\d+)?$', ''))
        WHERE to_number(x) < 2000;

【讨论】:

对不起,我已经尝试过了,它返回相同的错误“无效号码 @rwur 第二个查询?在那种情况下,你的小数分隔符是什么?

以上是关于Oracle:to_number() 在 WHERE 子句中结合 substr() 和 regexp_like()的主要内容,如果未能解决你的问题,请参考以下文章

Oracle:to_number() 在 WHERE 子句中结合 substr() 和 regexp_like()

什么是“oracle ORA-01722”无效数字?

Oracle中to_number函数格式参数问题

sql Oracle TO_NUMBER函数

oracle 取平均值

oracle to_number整数显示小数点