首先说说遇到的问题,在Access软件中写了一个带LIKE的SQL语句,可以正常执行,但是复制粘贴到ADO操作里面就出错了。其原因是这样的:如果ADO所采用的数据库引擎是Microsoft Jet Engine,它是以Microsoft SQL Server为基础的,所以即使使用Access数据库作为数据源,也不能使用Access的SQL语法,而要采用SQL Server的语法,而它们的语法虽然很相像,但是还是有一些小区别,如LIKE语句。这是少数不能在本地测试SQL运行结果的情况之一。一个简单的解决方案是在服务器条件允许的情况下采用Access OLE DB Provider作为数据库引擎。
下面总结一下常见数据库系统LIKE子句匹配符的异同点:
- 匹配单个字符和零到多个字符的两种基本匹配符。
- My SQL中使用
_
匹配单个字符,%
匹配零到多个字符。 - SQLite中使用
_
匹配单个字符,%
匹配零到多个字符。 - Oracle中使用
_
匹配单个字符,%
匹配零到多个字符。 - MS SQL中使用
_
匹配单个字符,%
匹配零到多个字符。 - Access中分为两种情况:
- Microsoft Jet引擎中使用
_
或?
匹配单个字符,%
或*
匹配多个字符。 - Access软件和DAO中使用
?
匹配单个字符,*
匹配多个字符。
- Microsoft Jet引擎中使用
- 匹配特定字符的复合匹配符。
- My SQL不支持复合匹配符,使用REGEXP(RLIKE)子句。
- SQLite不支持复合匹配符,使用REGEXP子句。
- Oracle中分为两种情况:
- Oracle 10g以前使用
[]
匹配特定字符,[^]
匹配非特定字符。 - Oracle 10g之后不再支持符合匹配符,使用regexp_like函数。
- Oracle 10g以前使用
- MS SQL中使用
[]
匹配特定字符,[^]
匹配非特定字符。 - Access中使用
[]
匹配特定字符,[!]
匹配非特定字符,#
匹配任意数字(即[0-9]
)。
- 匹配匹配符的自身匹配符
- My SQL中分为两种情况:
- 当NO_BACKSLASH_ESCAPES未激活时使用
\\%
匹配%
,\\\_
匹配\_
,\\\\
匹配\\
,并支持ESCAPE子句修改转义符。 - 当NO_BACKSLASH_ESCAPES被激活时无法匹配
%
和\_
,除非使用ESCAPE子句设置转义符。
- 当NO_BACKSLASH_ESCAPES未激活时使用
- SQLite中无法匹配
%
和_
,除非使用ESCAPE子句设置转义符。 - Oracle中使用
[%]
匹配%
,[\_]
匹配_
,[[]
匹配[
,并支持ESCAPE子句设置转义符。 - MS SQL中使用
[%]
匹配%
,[\_]
匹配_,[[]
匹配[
,并支持ESCAPE子句设置转义符。 - Access中使用
[%]
匹配%
(在需要时),[\*]
匹配\*
,[\_]
匹配\_
(在需要时),[?]
匹配?
,[[]
匹配[
。