我想请求有关记录测试的建议。
此时,我有一个account
字段,必须只包含数字。然而,由于前导零,这是一个varchar
字段。
我有这个查询实际上显示了帐号中的非数字(或null)。
LTRIM(TRANSLATE(ACCOUNT,'0123456789',' '),' ') INVALID_DATA
尽管如此,我只是面临另一个问题 - 空间没有被考虑在内,因此如果帐户有空格,则会被忽视为null
。是的,我可以用更容易识别的东西来代替空间,但这还够吗?我确信还有其他一些我不知道的例外情况。
有没有通用的方法来检查任何可能的变量而不是数字?也许是这样的?它有多可靠?
LENGTH(ACCOUNT)-LENGTH(TO_NUMBER(REGEXP_REPLACE((ACCOUNT), '[^[:digit:]]+', ''))) NON-NUMBERS
另外,如何检测和解释具有非Unicode字符的案例?
答案 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 '))