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

时间:2010-10-14 10:32:58

标签: sql oracle

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

如何编写一个sql查询,只返回保存纯数值=不包含字母的X?从上面的例子可以是“123”和“156”

选择X. 来自myTable 哪里...... ??

6 个答案:

答案 0 :(得分:62)

您可以将REGEXP_LIKE功能用作:

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

示例运行:

SQL> SELECT X FROM SO;

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

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

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

SQL> 

答案 1 :(得分:30)

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

select X from myTable where upper(X) = lower(X)

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

答案 2 :(得分:7)

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

select * from tablename  where translate(x, '.1234567890', '.') is null;

有关Oracle翻译功能的更多信息可以在here或官方文档“SQL Reference”

中找到

UPD :如果您的号码中有标记或空格,则可以将“+-”字符添加到translate函数的第二个参数中。

答案 3 :(得分: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;
/

答案 4 :(得分:4)

Oracle 11.1中regexp_like和其他regexp函数的完整列表:

http://66.221.222.85/reference/regexp.html

在你的例子中:

SELECT X
FROM test
WHERE REGEXP_LIKE(X, '^[[:digit:]]$');

答案 5 :(得分:3)

您可以使用以下命令 -

LENGTH(TRIM(TRANSLATE(string1, '+-.0123456789', '')))

如果string1为数字

,则返回NULL

您的查询将是 -

select * from tablename 
where LENGTH(TRIM(TRANSLATE(X, '+-.0123456789', ''))) is null