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

Oracle:返回仅包含数值的行的SQL查询,sql,oracle,Sql,Oracle,我有一个名为X的字段(Oracle中的列),其值为“a1b2c3”、“abc”、“1ab”、“123”、“156” 如何编写一个sql查询,只返回包含纯数值=无字母的X?从上面的例子可以看出,“123”和“156” 选择X 从myTable 其中…?Oracle 11.1中类似regexp的函数和其他regexp函数的完整列表: 在您的示例中: SELECT X FROM test WHERE REGEXP_LIKE(X, '^[[:digit:]]$'); 您可以将REGEXP\u LIK

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

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

选择X 从myTable
其中…?

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

在您的示例中:

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

您可以将
REGEXP\u 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> 

您可以使用以下命令-

LENGTH(TRIM(TRANSLATE(string1, '+-.0123456789', '')))
如果
string1
为数字,则返回NULL

你的问题是-

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

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

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

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

如果您使用Oracle 10或更高版本,您可以按照codaddict的建议使用regexp函数。在早期版本中,translate函数将帮助您:

select * from tablename  where translate(x, '.1234567890', '.') is null;
有关Oracle translate函数的更多信息,可以在官方文档“SQL参考”中找到


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

1.1E10、+1、-0等如何?解析所有可能的数字比许多人想象的要复杂。如果希望包含尽可能多的数字,则应在PL/SQL函数中使用to_number函数。From:


这将不起作用,它将报告在任何位置都有数字的行。您需要使用锚。有一些有用的信息您可以在Oracle 10i中使用regexp作为well@andr:谢谢:)我在一个11g的盒子上试过,所以不确定Oracle什么时候引入了正则表达式。与长度(TRIM(TRANSLATE)相比,这个测试的优点是去掉空值(string1,'+-.0123456789','')。这仍然有效吗?我们有一个12c数据库,但它似乎不适用于只选择返回列的数字的行。引用官方SQL参考文档:“您不能使用to_字符串的空字符串从返回值中删除from_字符串中的所有字符”。所以不能将空字符串用作TRANSLATE(string1,+-.0123456789,'')中的第三个参数。我认为第三个参数需要是一个空格:''这解决了一个不同的问题。他没有说数字,他说的是数字。我将“数值”解释为“数字”.我在考虑将字符串转换为数字的上下文;在这种情况下,您确实需要使用PL/SQL来防止无序执行导致“无效数字”错误。如果他真的只想检查数字,那么你是对的,这是行不通的。请注意,此解决方案比regexp或函数方法快得多:如果你在列中像
2019-05-15
(如果你添加+-)或
25.25.219
或其他带有多个点的数字,如格式化的客户编号
201.20111.56
、IP地址
192.168.1.1
等,它们将出现在您的结果中。您不能自动假定
到u编号
功能将成功。
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;
/