例如,我有一个表名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 '\'
我遇到语法错误。
答案 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])_';
(尽管我很乐意按照构建它的最佳方式推荐其他人。)