Sql 如何在regex函数中使用between

Sql 如何在regex函数中使用between,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有一个名为X的字段(Oracle中的列),其值为“a1b2c3”、“abc”、“1ab”、“123”、“156” 我编写了一个sql查询,只返回包含纯数值且不包含字母的X;从上面的例子可以看出是123和156 使用Oracle语法编写的查询: select X from where REGEXP_LIKE(X, '^[[:digit:]]+$') 结果: 123, 156 此外,我需要编写一个查询,以获得100到150之间的值 如何在Oracle中编写这样的查询?如下所示: select

我有一个名为X的字段(Oracle中的列),其值为“a1b2c3”、“abc”、“1ab”、“123”、“156”

我编写了一个sql查询,只返回包含纯数值且不包含字母的X;从上面的例子可以看出是123和156

使用Oracle语法编写的查询:

select X from where REGEXP_LIKE(X, '^[[:digit:]]+$')
结果:

123, 156
此外,我需要编写一个查询,以获得100到150之间的值

如何在Oracle中编写这样的查询?如下所示:

select X from where REGEXP_LIKE(X, '^[[:digit:]]+$') between 100 and 150
然后在查询中使用此选项

select X from where is_number(X)=1 and TO_Number(X) between 100 and 150
然后在查询中使用此选项

select X from where is_number(X)=1 and TO_Number(X) between 100 and 150
试试这个

with tbl(X) as
(select 'a1b2c3' from dual union all select
'abc' from dual union all select
'123' from dual union all select
'156' from dual )
select * from (
   select * from tbl where
     REGEXP_LIKE(X, '^[[:digit:]]+$') 
               ) t
where x between 100 and 150
试试这个

with tbl(X) as
(select 'a1b2c3' from dual union all select
'abc' from dual union all select
'123' from dual union all select
'156' from dual )
select * from (
   select * from tbl where
     REGEXP_LIKE(X, '^[[:digit:]]+$') 
               ) t
where x between 100 and 150
,所以你无法将它与任何东西进行比较。您可以改为使用:

函数返回的值要么为null,要么是可以(隐式)转换为数字进行比较的数字字符串

使用示例数据演示:

with your_table (x) as (
  select 'a1b2c3' from dual
  union all select 'abc' from dual
  union all select '1ab' from dual
  union all select '123' from dual
  union all select '156' from dual
)
select x from your_table
where regexp_substr(x, '^[[:digit:]]+$') between 100 and 150;

X     
------
123
,所以你无法将它与任何东西进行比较。您可以改为使用:

函数返回的值要么为null,要么是可以(隐式)转换为数字进行比较的数字字符串

使用示例数据演示:

with your_table (x) as (
  select 'a1b2c3' from dual
  union all select 'abc' from dual
  union all select '1ab' from dual
  union all select '123' from dual
  union all select '156' from dual
)
select x from your_table
where regexp_substr(x, '^[[:digit:]]+$') between 100 and 150;

X     
------
123


为什么不从函数中返回解析后的数字,或者在出现错误时返回
NULL
?函数用于检查值是否为数字,如果是数字,则返回1,否则返回0。也不能保证函数调用会首先在此处进行计算,因此仍然可能得到ORA-01722。根据MTO的建议,这是可以的。我知道它的作用,但您可以将其简化为:
CREATE FUNCTION check_number(VARCHAR2中的p_字符串)返回号是BEGIN RETURN to_number(p_字符串);值出错时异常,然后返回NULL;结束检查\u编号
并在
之间的
过滤器中使用它。正如@AlexPoole所指出的,如果在检查
是否为数字之前执行
TO_NUMBER
检查,您将得到ORA-01722。为什么不从函数中返回解析后的数字,或者在出现错误时返回
NULL
?函数用于检查值是否为数字,如果是数字,则返回1,否则将返回0。这不能保证您的正确性函数调用也将首先在这里求值,因此仍然可能得到ORA-01722。根据MTO的建议,这是可以的。我知道它的作用,但您可以将其简化为:
CREATE FUNCTION check_number(VARCHAR2中的p_字符串)返回号是BEGIN RETURN to_number(p_字符串);值出错时异常,然后返回NULL;结束检查\u编号
并在
之间的
过滤器中使用它。正如@AlexPoole所指出的,如果在
是\u NUMBER
检查之前执行
TO\u NUMBER
检查,您将得到ORA-01722。是否有3位以上的数字?是否有3位以上的数字?如果在
regexp\u like()之前计算(隐式)TO\u编号,这也将得到ORA-01722。试着用桌子,而不是CTE。让我试试,你说得对!CTE的行为似乎更随意。使用子查询将我的答案编辑回上一个。不管怎么说,因为你的回答,现在没有意义了。事实上,我对你最初的问题也有同样的看法;我猜谓词被推到了子查询中,没有任何帮助。取决于乐观者的心情(我想是*8-)如果在
regexp\u like()
之前计算(隐式)to\u数,这也将得到ORA-01722。试着用桌子,而不是CTE。让我试试,你说得对!CTE的行为似乎更随意。使用子查询将我的答案编辑回上一个。不管怎么说,因为你的回答,现在没有意义了。事实上,我对你最初的问题也有同样的看法;我猜谓词被推到了子查询中,没有任何帮助。取决于乐观主义者的心情,我想*8-)