如何在Oracle SQL中选择仅包含数字字符的行
我只想保留带有数字字符的行,即0-9。我的源数据可以有任何类型的字符,例如2、%、( 我尝试过使用如何在Oracle SQL中选择仅包含数字字符的行,sql,oracle,Sql,Oracle,我只想保留带有数字字符的行,即0-9。我的源数据可以有任何类型的字符,例如2、%、( 我尝试过使用WHERE REGEXP_LIKE(邮政编码“^[:digit:][]+$”; 然而,在我的Oracle版本中,我得到一个错误,即 函数regexp_like(字符变化,“未知”)不存在 对于Oracle 10或更高版本,您可以使用regexp函数。在早期版本中,translate函数将帮助您: SELECT postcode FROM table_name WHERE length(t
WHERE REGEXP_LIKE(邮政编码“^[:digit:][]+$”;
然而,在我的Oracle版本中,我得到一个错误,即
函数regexp_like(字符变化,“未知”)不存在
对于
Oracle 10
或更高版本,您可以使用regexp
函数。在早期版本中,translate函数将帮助您:
SELECT postcode
FROM table_name
WHERE length(translate(postcode,'0123456789','1')) is null
AND postcode IS NOT NULL;
或
上述答案对我也适用
SELECT translate('1234bsdfs3@23##PU', '0123456789' || translate('1234bsdfs3@23##PU','x123456789','x'),'0123456789') nums
FROM dual ;
Nums:
1234323
您需要regexp\u like()
,并且您的版本应该可以工作:
select t.*
from t
where regexp_like(t.postcode, '^[0-9]+$');
但是,您的错误看起来更像是Postgres错误,因此这可能会起作用:
t.postcode ~ '^[0-9]+$'
对于Gordon Linoff答案的替代方法,我们可以尝试使用
REGEXP\u REPLACE
:
SELECT *
FROM yourTable
WHERE REGEXP_REPLACE(postcode, '[0-9]+', '') IS NULL;
这里的想法是去掉所有数字字符,然后声明没有留下任何字符。对于混合数字字母值,正则表达式替换将导致非空字符串。谢谢,我尝试了这一点,并在我的邮政编码列中为每一行获取空值,因此它无法正常工作。我希望保留仅包含nume的行ric编号0-9我尝试过这个,但仍然可以看到带有字母GB2的邮政编码2G6@Andrew这不应该是另一种方式吗,即与
is null
进行比较以获得要保留的行,与is not null
进行比较以获得要删除的行?@bp123现在查看我的最后两个更新答案,并让我知道是哪一个works@Adder是的,我已经做了但是bp123说它对他不起作用,这很奇怪,错误消息听起来不像Oracle,听起来更像Postgres。为什么不在数据加载到系统之前清理数据(或者更好,添加输入保护,这样用户就不会输入错误的数据)?祝你好运。嗨,我试过了,得到了和regexp_一样的错误函数(字符变化,“未知”)不存在=”
在Oracle中永远不会为真,因为没有单独的“空字符串”。@比尔:是的,你说得对,我应该进行空检查。
t.postcode ~ '^[0-9]+$'
SELECT *
FROM yourTable
WHERE REGEXP_REPLACE(postcode, '[0-9]+', '') IS NULL;