问题描述
我有一个需要针对sql,MysqL,ORACLE,Postgres运行的查询。基本上,我有一个记录列表,希望在搜索时获取与输入模式匹配的记录。
例如
SELECT * FROM BOOKS WHERE NAME LIKE '%TEST¤_1%' ESCAPE '¤'
@H_404_7@(此查询只是我实际尝试运行的示例)。
我已经使用转义符“¤”(ASCII代码-164)来转义通配符(下划线字符),因此例如,如果我搜索 1,我会将_字符替换为¤它会给我只包含名称1的书,而不给我包含1之前的任何字符的书。
对于MysqL,postgres和sql来说运行正常,但是在oracle中,当我运行上述查询时,它将在最新版本的oracle上引发以下错误。
ORA-01425: escape character must be character string of length 1 01425. 00000 - "escape character must be character string of length 1" *Cause: Given escape character for LIKE is not a character string of length 1. *Action: Change it to a character string of length 1.
@H_404_7@在11G版本的oracle中工作正常。
11G的NLS_CHaraCTERSET也为WE8MSWIN1252,而最新的oracle版本为AL32UTF8。
在以下查询条件下运行时,我的长度为1。
SELECT LENGTH('¤') FROM BOOKS
@H_404_7@在安装oracle时,是否可以选择启用对扩展的ascii代码(字符代码128-255)的支持,还是我需要使用其他任何字符来转义通配符(_)?如果是,其他字符可以我用吗?
解决方法
这里是执行此操作的一种方法-使用
BEL
字符,其ASCII值为7。with sample_data (name) as ( select 'TWITTER' from dual union all select 'MY_PHONE' from dual union all select 'MYOHMY' from dual ) select name from sample_data where name like 'MY' || chr(7) || '_%' escape chr(7) ; NAME --------- MY_PHONE
注意使用
CHR()
函数输入特殊字符。如果您使用其他机制(例如,键盘组合,使用各种特殊键),则无法完全控制;chr(7)
的{{1}}没问题。