简化SQL中的重复函数调用

时间:2015-09-25 19:27:17

标签: sql oracle refactoring

我正在寻找一种简化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不为空。

该查询适用于我的目的,但我对我所做的复制粘贴编程不满意。

1 个答案:

答案 0 :(得分:2)

使用正则表达式:

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

或者,您可能希望列出 有效的字符。像这样:

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