首先说说遇到的问题,在Access软件中写了一个带LIKE的SQL语句,可以正常执行,但是复制粘贴到ADO操作里面就出错了。其原因是这样的:如果ADO所采用的数据库引擎是Microsoft Jet Engine,它是以Microsoft SQL Server为基础的,所以即使使用Access数据库作为数据源,也不能使用Access的SQL语法,而要采用SQL Server的语法,而它们的语法虽然很相像,但是还是有一些小区别,如LIKE语句。这是少数不能在本地测试SQL运行结果的情况之一。一个简单的解决方案是在服务器条件允许的情况下采用Access OLE DB Provider作为数据库引擎。

下面总结一下常见数据库系统LIKE子句匹配符的异同点:

  1. 匹配单个字符零到多个字符的两种基本匹配符。
  • My SQL中使用_匹配单个字符,%匹配零到多个字符。
  • SQLite中使用_匹配单个字符,%匹配零到多个字符。
  • Oracle中使用_匹配单个字符,%匹配零到多个字符。
  • MS SQL中使用_匹配单个字符,%匹配零到多个字符。
  • Access中分为两种情况:
    • Microsoft Jet引擎中使用_?匹配单个字符,%*匹配多个字符。
    • Access软件和DAO中使用?匹配单个字符,*匹配多个字符。
  1. 匹配特定字符的复合匹配符。
  • My SQL不支持复合匹配符,使用REGEXP(RLIKE)子句。
  • SQLite不支持复合匹配符,使用REGEXP子句。
  • Oracle中分为两种情况:
    • Oracle 10g以前使用[]匹配特定字符,[^]匹配非特定字符。
    • Oracle 10g之后不再支持符合匹配符,使用regexp_like函数。
  • MS SQL中使用[]匹配特定字符,[^]匹配非特定字符。
  • Access中使用[]匹配特定字符,[!]匹配非特定字符,#匹配任意数字(即[0-9])。
  1. 匹配匹配符的自身匹配符
  • My SQL中分为两种情况:
    • 当NO_BACKSLASH_ESCAPES未激活时使用\\%匹配%\\\_匹配\_\\\\匹配\\,并支持ESCAPE子句修改转义符。
    • 当NO_BACKSLASH_ESCAPES被激活时无法匹配%\_,除非使用ESCAPE子句设置转义符。
  • SQLite中无法匹配%_,除非使用ESCAPE子句设置转义符。
  • Oracle中使用[%]匹配%[\_]匹配_[[]匹配[,并支持ESCAPE子句设置转义符。
  • MS SQL中使用[%]匹配%[\_]匹配_,[[]匹配[,并支持ESCAPE子句设置转义符。
  • Access中使用[%]匹配%(在需要时),[\*]匹配\*[\_]匹配\_(在需要时),[?]匹配?[[]匹配[