简化 SQL 中的重复函数调用

Simplifying repetitive function call in SQL

我正在寻找一种方法来简化 Oracle 10g 中的以下查询,最好不要求助于 PL/SQL 构造:

SELECT * FROM my_table
WHERE instr(my_col, '<')
    + instr(my_col, '>')
    + instr(my_col, ':')
    + instr(my_col, '"')
    + instr(my_col, '/')
    + instr(my_col, '\')
    + instr(my_col, '|')
    + instr(my_col, '?')
    + instr(my_col, '*')
    + instr(my_col, CHR(0))
    + instr(my_col, CHR(1))
    + instr(my_col, CHR(2))
       -- ...
    + instr(my_col, CHR(31)) > 0 

查询正在查找 Windows paths 中的非法字符。值得庆幸的是,我后来将已知的合法字符附加到 my_col,因此我不必处理其他更复杂的非法名称情况。可以假定 my_col 不为空。

该查询对我的目的来说效果很好,但我对我所做的复制粘贴编程不满意。

使用正则表达式:

where regexp_like(my_col, '[<>:"''/\|?*\x00\x01\x02]') 

或者,您可能更愿意列出 有效的字符。像这样:

where regexp_like(my_col, '[^a-zA-Z0-9_]')