字符串验证中的数字与非数字

时间:2014-07-21 14:56:36

标签: sql oracle validation

我想请求有关记录测试的建议。

此时,我有一个account字段,必须只包含数字。然而,由于前导零,这是一个varchar字段。

我有这个查询实际上显示了帐号中的非数字(或null)。

LTRIM(TRANSLATE(ACCOUNT,'0123456789',' '),' ') INVALID_DATA

尽管如此,我只是面临另一个问题 - 空间没有被考虑在内,因此如果帐户有空格,则会被忽视为null。是的,我可以用更容易识别的东西来代替空间,但这还够吗?我确信还有其他一些我不知道的例外情况。

有没有通用的方法来检查任何可能的变量而不是数字?也许是这样的?它有多可靠?

LENGTH(ACCOUNT)-LENGTH(TO_NUMBER(REGEXP_REPLACE((ACCOUNT), '[^[:digit:]]+', ''))) NON-NUMBERS

另外,如何检测和解释具有非Unicode字符的案例?

3 个答案:

答案 0 :(得分:2)

我只想使用regexp_replace方法在字符串中查找非数字:

regexp_replace(account, '\d+')

<强>解释

- 转义字符\d是数字字符的元字符。

- +符号是一个量词,表示该数字的一个或多个实例。

因此,我们将删除帐户列中的所有数字,并且该数字为非null, 你有非号码。
~~~~~~~~~~~~

关于你的计算:

LENGTH(ACCOUNT)-LENGTH(TO_NUMBER(REGEXP_REPLACE((ACCOUNT), '[^[:digit:]]+', ''))) NON-NUMBERS

您的reg表达式会查找非数字并将其删除。你的方法会起作用(我不喜欢将字符串转换为数字然后动态地转换为字符串)。如果在条件中使用它,则需要将其封装在NVL函数中,如下所示:

NVL(LENGTH(ACCOUNT)-LENGTH(REGEXP_REPLACE(ACCOUNT, '[^[:digit:]]+', '')),0)  NON-NUMBERS

答案 1 :(得分:0)

我认为你有正确的想法:

LTRIM(TRANSLATE(ACCOUNT, ' 0123456789', 'X'), ' ') as INVALID_DATA

当有空格时应返回非空字符串。

where子句中,您将使用:

where LENGTH( LTRIM(TRANSLATE(ACCOUNT, ' 0123456789', 'X'), ' ')) > 0

答案 2 :(得分:0)

您可以替换所有这样的空格:

SELECT REPLACE(fld_or_variable, ' ', '')

或者你可以修剪这样的空间

SELECT LTRIM(RTRIM(' Amit Tech Corp '))