逃避通配符之间和运营商

时间:2012-02-08 08:49:32

标签: oracle wildcard between

例如,我有一个表名test_table,并且有一个名为column_A的列,其中包含值:

A_1
A_2
A_3
A1
A2
A3
B_1
B_2
B_3
B1
B2
B3

如果我想选择以A_为开头的所有数据,我可以使用escape \,如:

select * from test_table where column_A like 'A\_*' escape '\';

以便_不被视为单个字符通配符。我可以得到A_1,A_2和A_3。

当我想在Between和运算符中使用它时,我该怎么办?像

select * from test_table where column_A between 'A_\*' and 'B_\*' 

我尝试了上面的一个,它没有逃脱_。如果我在条件之后添加一个转义,如

select * from test_table 
 where column_A between 'A_\*' escape '\' and 'B_\*' escape '\'

select * from test_table 
 where column_A between 'A_\*' and 'B_\*' escape '\'

我遇到语法错误。

2 个答案:

答案 0 :(得分:2)

您无法使用比较运算符转义字符,因为这些运算符没有通配符。我不认为BETWEEN是该任务的正确操作者。

您似乎希望所有字符串以A和B之间的字母开头,后跟_。我建议你看看regexp_like,它比LIKE运算符更灵活。例如,你可以写:

SQL> WITH test_table AS (
  2     SELECT 'A_1' column_A FROM dual
  3     UNION ALL SELECT 'A_2' FROM dual
  4     UNION ALL SELECT 'A_3' FROM dual
  5     UNION ALL SELECT 'A1' FROM dual
  6     UNION ALL SELECT 'A2' FROM dual
  7     UNION ALL SELECT 'A3' FROM dual
  8     UNION ALL SELECT 'B_1' FROM dual
  9     UNION ALL SELECT 'B_2' FROM dual
 10     UNION ALL SELECT 'B_3' FROM dual
 11     UNION ALL SELECT 'B1' FROM dual
 12     UNION ALL SELECT 'B2' FROM dual
 13     UNION ALL SELECT 'B3' FROM dual
 14  )
 15  SELECT * FROM test_table
 16   WHERE regexp_like (column_A, '^[A-B]_.*');

COLUMN_A
--------
A_1
A_2
A_3
B_1
B_2
B_3

答案 1 :(得分:2)

BETWEEN没有似乎允许使用该语法转义通配符 ;我假设你得到ORA-00933:SQL命令没有正确结束? (对于实际陈述您所看到的错误总是有用的)。 虽然允许使用替代语法:

select * from test_table
where column_A between 'A[_]%' and 'B[_]%';

编辑实际上虽然允许使用语法,但它没有做任何事情; BETWEEN无论如何都不会将_视为通配符,但它会将%视为一个。

编辑2 正如@Allan指出的那样,它确实没有将%视为通配符,这就是字符排序的工作方式。

我不确定这是你真正想要的,因为它会给你A_1, A_2, A_3, B1, B2, B3(至少我的NLS参数)。

如果您真正想要的是A_1, A_2, A_3, B_1, B_2, B_3,那么您可以使用REGEXP_LIKE代替:

select * from test_table
where regexp_like(column_A, '^([AB])_';

(尽管我很乐意按照构建它的最佳方式推荐其他人。)