我有一个名为X的字段(Oracle中的列),其值为“a1b2c3”,“abc”,“1ab”,“123”,“156”
如何编写一个sql查询,只返回保存纯数值=不包含字母的X?从上面的例子可以是“123”和“156”
选择X. 来自myTable 哪里...... ??
答案 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
为数字
您的查询将是 -
select * from tablename
where LENGTH(TRIM(TRANSLATE(X, '+-.0123456789', ''))) is null