如何检查无效字符?甲骨文SQL

Net*_*eto 0 sql oracle plsql

寻找方法从 Oracle SQL 中的 StudentID 中过滤掉特殊符号、字母等,并将这些记录显示为无效。

过滤掉字母 aZ 和其他字符的最佳方法是什么?(只留下数字)

SELECT replace(Translate(studentid,'a-Z<>!-\+=/&', '??'),'?','') as StudentID, 'Invalid Characters in Student ID' 
FROM students
Run Code Online (Sandbox Code Playgroud)

小智 6

最简单的方法是使用正则表达式。例如

select studentid
from   student
where  regexp_like(studentid, '\D')
;
Run Code Online (Sandbox Code Playgroud)

\D表示非数字字符;如果studentid在任何位置至少包含一个这样的字符,那么它将出现在输出中。请注意,null假设它可能出现在列中,则不会被标记出来;也许该列是主键,在这种情况下它不能是null。但这也适用于其他表,其中studentid可能是null.

如果您有一个非常大的表,或者必须经常执行此检查,您可能需要一个不太简单但性能更好的查询。然后您会想要使用标准字符串函数,就像您尝试的那样。像这样的事情会起作用:

select studentid
from   student
where  translate(studentid, 'x0123456789', 'x') is not null
;
Run Code Online (Sandbox Code Playgroud)

translate将转换x为自身,并将所有数字转换为null(即,所有数字将被删除)。需要这个x技巧,因为最后一个参数不能是null。如果翻译没有从字符串中删除所有studentid字符,则会根据需要出现在输出中。

如果您需要准确显示哪些字符是非数字(尽管这应该是显而易见的),您可以将结果添加到子句translateselect。但请注意,例如,如果学生 ID 具有尾随空格,则从查看学生 ID 或翻译结果来看,这一点都不会明显。您可能想添加类似的dump(studentid)内容select;如果您不熟悉dump,您可能需要阅读一些相关内容 - 它在诊断此类问题时非常有用,并且易于学习。

找到并处理所有异常后,您可能需要向该列添加约束,以要求所有学生 ID 完全由数字组成。那么您就不必再忍受此类错误了。