Oracle ! ;)真是聪明的解决方案。我不知道REGEXP_,比如:)。谢谢,小伙子,你觉得这很有帮助。我不能赊账。OP链接在上面。但是谢谢。要包含负片,请使用类似REGEXP_(foo,“^-?[:digit]]]+$”)的REGEXP_来匹配浮点数,请参考Mat

Oracle ! ;)真是聪明的解决方案。我不知道REGEXP_,比如:)。谢谢,小伙子,你觉得这很有帮助。我不能赊账。OP链接在上面。但是谢谢。要包含负片,请使用类似REGEXP_(foo,“^-?[:digit]]]+$”)的REGEXP_来匹配浮点数,请参考Mat,oracle,plsql,oracle10g,Oracle,Plsql,Oracle10g,! ;)真是聪明的解决方案。我不知道REGEXP_,比如:)。谢谢,小伙子,你觉得这很有帮助。我不能赊账。OP链接在上面。但是谢谢。要包含负片,请使用类似REGEXP_(foo,“^-?[:digit]]]+$”)的REGEXP_来匹配浮点数,请参考Matt Byrnes的答案。为什么不使用1和0而不是“Y”和“N”?PL/SQL具有数字数据类型,SQL将在查询中接受1和0。@eyetea-个人首选项。您当然可以返回0或1。如果开发人员都会说英语,我倾向于选择Y和N,因为这有点自我记录。如果你处



! ;)真是聪明的解决方案。我不知道REGEXP_,比如:)。谢谢,小伙子,你觉得这很有帮助。我不能赊账。OP链接在上面。但是谢谢。要包含负片,请使用类似REGEXP_(foo,“^-?[:digit]]]+$”)的REGEXP_来匹配浮点数,请参考Matt Byrnes的答案。为什么不使用1和0而不是“Y”和“N”?PL/SQL具有数字数据类型,SQL将在查询中接受1和0。@eyetea-个人首选项。您当然可以返回0或1。如果开发人员都会说英语,我倾向于选择Y和N,因为这有点自我记录。如果你处理的是更多的国际发展,那么0和1通过将语言从混合中分离出来就更有意义了。我只是说,在0和1的情况下,没有必要写is_number(myTable.id)=1,但是is_number(myTable.id)就足够了@眼茶-那不是真的。在PL/SQL中,0不是隐式false,1不是隐式true。您仍然需要表达式的
=1
部分才能生成布尔结果。@Reimius-这取决于数据实际为数字的频率。异常通常是昂贵的,所以如果大多数数据是非数字的,这种方法会有点低效。另一方面,如果大多数数据是数字的,则此函数相当有效。这还考虑了非整数,Saish的正则表达式不允许,也不允许非整数,如Kevlined的解决方案中的
1.234.567.890
。并且它尊重会话的十进制分隔符是什么。为了包含负数,表达式应该在REGEXP_喜欢的位置(foo,“^-?\d+(\。\d+)?$”;是的,这是一个很好的观点——我粘贴了我的regexp,因为我正在做一件我只想要正数的事情。将更新我的答案-爱的名字顺便说一句shonky;-)那么
.1
+1
1234f
1e1
呢?并非所有这些数字都被认为是“数字”,但它们对Oracle来说都是有效的数字。如果它们是“Oracle的数字”,那么它们将被存储为数字。既然问题是关于一个
VARCHAR
/
VARCHAR2
/那么问题更多的是关于生成数字的系统/代码,而不一定是Oracle本身(想象一下Oracle之外的世界)。在这种情况下,你可以像你喜欢的那样学究气,或者试着去适应手头的用例。评论是公平的,否决票是不必要的。需要这一个投票,因为这是最好的答案在这里<代码>无效\u编号是错误的例外。这是SQL语句的例外,但在PL/SQL中,例外是
value\u error
。我很高兴您在原始答案中提到了纯度规则。它让我想起了在并行SQL中使用这些函数时遇到的问题,并通过添加
DETERMINISTIC
parallel\u ENABLE
帮助改进了公认的答案。然而,这个版本并不比原来的函数更“纯粹”。由于不涉及包变量,因此不应用“不写入包”状态。简单地说“更纯粹”并没有帮助,必须声明它才能让并行性等功能发挥作用。@jonearles-justin的解决方案包含一个变量“l_num”,我将其解释为“包变量”但是在测试中,我发现断言不受函数变量的影响。@jonearles-我有一些回答,我将分成不同的注释1。Justin的解决方案包含一个变量“l_num”,我将其解释为“包变量”,但在测试中,我发现断言不受函数变量的影响-因此它确实不是更纯粹的。@jonearles关于您的确定性观察:实现和实现之间存在差异。每个用例的实现都是可选的,但由于没有实现是不可能的,所以我所指的实现是至关重要的。此外,我的函数位于包体中,断言是通过RESTRICT_REFERENCES pragma在规范中完成的。@jonearles-尽管我的函数确实不是更纯粹的函数,但它仍然是我的首选,因为不需要定义,也不需要为,Justin的解决方案中包含的本质上不相关的l_num变量。如果您不受Oracle版本的限制,则可能存在重复的内置函数。如果有来自下一个投票的注释,这将非常棒。我在简化的变体中使用了此解决方案:
从翻译栏中选择foo(您的_编号'X0123456789','X')为空

请注意,X不会被翻译。使用它的唯一原因是第二个字符串不能是空字符串。
select case when ( is_number(myTable.id) and (myTable.id >0) ) 
            then 'Is a number greater than 0' 
            else 'it is not a number' 
       end as valuetype  
  from table myTable
create or replace function is_number(param varchar2) return boolean
 as
   ret number;
 begin
    ret := to_number(param);
    return true;
 exception
    when others then return false;
 end;
CREATE OR REPLACE FUNCTION is_number( p_str IN VARCHAR2 )
  RETURN VARCHAR2 DETERMINISTIC PARALLEL_ENABLE
IS
  l_num NUMBER;
BEGIN
  l_num := to_number( p_str );
  RETURN 'Y';
EXCEPTION
  WHEN value_error THEN
    RETURN 'N';
END is_number;
SELECT (CASE WHEN is_number( myTable.id ) = 'Y' AND myTable.id > 0 
               THEN 'Number > 0'
             ELSE 'Something else'
         END) some_alias
  FROM myTable
create or replace function myToNumber(i_val in varchar2) return number is
 v_num number;
begin
 begin
   select to_number(i_val) into v_num from dual;
 exception
   when invalid_number then
   return null;
 end;
 return v_num;
end;
select * from someTable where myToNumber(someCharField) > 0;
create or replace function is_number(param in varchar2) return integer
 is
   ret number;
 begin
    ret := to_number(param);
    return 1; --true
 exception
    when invalid_number then return 0;
 end;
select case when ( is_number(myTable.id)=1 and (myTable.id >'0') ) 
            then 'Is a number greater than 0' 
            else 'it is not a number or is not greater than 0' 
       end as valuetype  
  from table myTable
SELECT  foo 
FROM    bar
WHERE   REGEXP_LIKE (foo,'^[[:digit:]]+$');
select case
       when regexp_like(myTable.id, '[[:digit:]]') then
        case
       when myTable.id > 0 then
        'Is a number greater than 0'
       else
        'Is a number less than or equal to 0'
     end else 'it is not a number' end as valuetype
from table myTable
CREATE OR REPLACE FUNCTION is_number(N IN VARCHAR2) RETURN NUMBER IS
  BEGIN
    RETURN CASE regexp_like(N,'^[\+\-]?[0-9]*\.?[0-9]+$') WHEN TRUE THEN 1 ELSE 0 END;
END is_number;
create or replace FUNCTION VALIDATE_MOBILE_NUMBER
(   
   "MOBILE_NUMBER" IN varchar2
)
RETURN varchar2
IS
  v_result varchar2(10);

BEGIN
    CASE
    WHEN length(MOBILE_NUMBER) = 10 
    AND MOBILE_NUMBER IS NOT NULL
    AND REGEXP_LIKE(MOBILE_NUMBER, '^[0-9]+$')
    AND MOBILE_NUMBER Like '9%' OR MOBILE_NUMBER Like '8%' OR MOBILE_NUMBER Like '7%'
    then 
    v_result := 'valid';
    RETURN v_result;
      else 
      v_result := 'invalid';
       RETURN v_result;
       end case;
    END;
SELECT foo
FROM bar
WHERE DECODE(TRIM(TRANSLATE(your_number,'0123456789',' ')), NULL, 'number','contains char') = 'number'
SELECT foo
FROM bar
WHERE DECODE(TRIM(TRANSLATE(your_number,'+-.0123456789',' ')), NULL, 'number','contains char') = 'number'
SELECT  foo 
FROM    bar
WHERE   REGEXP_LIKE (foo,'^-?\d+(\.\d+)?$');
SELECT  foo 
FROM    bar
WHERE   NOT REGEXP_LIKE (foo,'^-?\d+(\.\d+)?$');
function validNumber(vSomeValue IN varchar2)
     return varchar2 DETERMINISTIC PARALLEL_ENABLE
     is
begin
  return case when abs(vSomeValue) >= 0 then 'T' end;
exception
  when value_error then
    return 'F';
end;
select case when upper(dummy)=lower(dummy) then '~numeric' else '~alpabetic' end from dual
select case when instr(dummy, 'X')>0 then '~alpabetic' else '~numeric' end from dual
select case when instr(dummy, '0')=0 then '~alpabetic' else '~numeric' end from dual
IF(rtrim(P_COD_LEGACY, '0123456789') IS NULL) THEN
                return 1;
          ELSE
                return 0;
          END IF;
Select myVarcharField
From myTable
where not REGEXP_LIKE(myVarcharField, '^(-)?\d+(\.\d+)?$', '')
and not REGEXP_LIKE(myVarcharField, '^(-)?\d+(\,\d+)?$', '');
SELECT NVL((SELECT 1 FROM  DUAL WHERE   REGEXP_LIKE (:VALOR,'^[[:digit:]]+$')),0) FROM DUAL;
SELECT
    TEST_TABLE.*,

    CASE WHEN
        TRANSLATE(TEST_TABLE.TEST_COLUMN, 'a.,0123456789', 'a') IS NULL
    THEN 'Y'
    ELSE 'N'
    END
    AS IS_NUMERIC

FROM
    (
    -- DUMMY TEST TABLE
        (SELECT '1' AS TEST_COLUMN FROM DUAL) UNION
        (SELECT '1,000.00' AS TEST_COLUMN FROM DUAL) UNION
        (SELECT 'xyz1' AS TEST_COLUMN FROM DUAL) UNION
        (SELECT 'xyz 123' AS TEST_COLUMN FROM DUAL) UNION
        (SELECT '.,' AS TEST_COLUMN FROM DUAL)
    ) TEST_TABLE
TEST_COLUMN IS_NUMERIC
----------- ----------
.,          Y
1           Y
1,000.00    Y
xyz 123     N
xyz1        N

5 rows selected.
TRANSLATE(TEST_TABLE.TEST_COLUMN, 'a0123456789', 'a') IS NULL