Oracle:返回仅包含数值的行的SQL查询

Ima*_*ree 38 sql oracle

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

我如何编写一个sql查询,只返回保存纯数值=没有字母的X?从上面的例子可以是"123"和"156"

从myTable中选择X哪里......?

cod*_*ict 62

您可以使用以下REGEXP_LIKE功能:

SELECT X 
FROM myTable 
WHERE REGEXP_LIKE(X, '^[[:digit:]]+$');
Run Code Online (Sandbox Code Playgroud)

样品运行:

SQL> SELECT X FROM SO;

X
--------------------
12c
123
abc
a12

SQL> SELECT X  FROM SO WHERE REGEXP_LIKE(X, '^[[:digit:]]+$');

X
--------------------
123

SQL> 
Run Code Online (Sandbox Code Playgroud)


Ton*_*ews 30

如果要考虑的唯一字符是字母,那么你可以这样做:

select X from myTable where upper(X) = lower(X)
Run Code Online (Sandbox Code Playgroud)

但当然,这不会过滤掉其他字符,只是字母.

  • 请注意,此解决方案比正则表达式或函数方法快得多:https://asktom.oracle.com/pls/asktom/f?p = 100:11:0 :: ::P11_QUESTION_ID:1132906300346063525 (2认同)

and*_*ndr 7

如果您使用Oracle 10或更高版本,则可以使用readxp函数作为codaddict建议.在早期版本中,translate函数将帮助您:

select * from tablename  where translate(x, '.1234567890', '.') is null;
Run Code Online (Sandbox Code Playgroud)

有关Oracle翻译功能的更多信息可以在此处或官方文档"SQL Reference"中找到

UPD:如果您的数字中有符号或空格,则可以+-translate函数的第二个参数中添加" "字符.


Jon*_*ler 5

那1.1E10,+ 1,-0等呢?解析所有可能的数字比许多人想象的要复杂。如果要包含尽可能多的数字,则应在PL / SQL函数中使用to_number函数。来自http://www.oracle-developer.net/content/utilities/is_number.sql

CREATE OR REPLACE FUNCTION is_number (str_in IN VARCHAR2) RETURN NUMBER IS
   n NUMBER;
BEGIN
   n := TO_NUMBER(str_in);
   RETURN 1;
EXCEPTION
   WHEN VALUE_ERROR THEN
      RETURN 0;
END;
/
Run Code Online (Sandbox Code Playgroud)