SQL查询语句通配符与ACCESS模糊查询like的解决方法

ACCESS的通配符和SQL SERVER的通配符比较
===================================================
ACCESS库的通配符为:
*   与任何个数的字符匹配
?   与任何单个字母的字符匹配

SQL Server中的通配符为:
% 与任何个数的字符匹配
_ 与单个字符匹配
正文
我今天在写个页面的时候,也很郁闷,表中明明有记录,但在ASP里就是搜索不到,理论的sql语句如下:
Select * FROM t_food Where t_food.name like '*苹果*'
去GOOGLE搜搜发现,ASP中模糊查询要这样写:
Select * FROM t_food Where t_food.name like '%%苹果%%'

必须是“%”,而且要两个。大家多注意。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

SQL查询语句通配符问题

在Access中用SQL语句进行数据查询时,用了通配符*进行查询。语句如下:

Select * from normal where bookname like '*h*'

在Access的SQL视图中试验没有任何问题,工作一切正常。于是将SQL语句写入到C#程序中,结果一到查询语句时就出错跳出,百思不得其解。于是查找Access帮助文件,找到如下帮助:

////////////////////////////////////////////////////////////

将字符串表达式与 SQL 表达式中的模式进行比较。

语法
expression Like "pattern"

Like 运算符语法包含以下部分:

部分说明
expression 在 Where 子句中使用的 SQL 表达式。
pattern 与 expression 进行比较的字符串文字。

说明
可以通过 Like 运算符来查找与所指定的模式相匹配的字段值。对于 pattern,可以指定完整的值(例如 Like "Smith"),也可以使用通配符来查找某个范围内的值(例如 Like "Sm*")。

在表达式中,可以使用 Like 运算符来比较字段值与字符串。例如,如果在 SQL 查询中输入 Like "C*",那么该查询将返回所有以字母 C 开头的字段值。在参数查询中,可以提示用户键入要搜索的模式。

下面的示例返回以字母 P 开头并且后面为 A 到 F 之间任何字母以及三个数字的数据:

Like "P[A-F]###"

下表展示了如何通过 Like 来测试不同模式的表达式。

匹配类型
模式匹配
(返回 True)不匹配
(返回 False)
多个字符 a*a aa, aBa, aBBBa aBC
   *ab* abc, AABB, Xab aZb, bac
特殊字符 a
a a*a aaa
多个字符 ab* abcdefg, abc cab, aab
单个字符 a?a aaa, a3a, aBa aBBBa
单个数字 a#a a0a, a1a, a2a aaa, a10a
字符范围 [a-z] f, p, j 2, &
范围之外 [!a-z] 9, &, % b, a
非数字值 [!0-9] A, a, &, ~ 0, 1, 9
复合值 a[!b-m]# An9, az0, a99 abc, aj0

参考地址:http://office.microsoft.com/zh-cn/assistance/HP010322532052.aspx

///////////////////////////////////////////////////////////

帮助都这么写了,没有任何问题啊,到底问题是出在哪里呢?更加让本人迷惑。后来问了一下同事说:你的SQL语句错了,通配符应该用%,而不是*。可是帮助里面说的是*,而且我在Access中试验一切正常,同事也说不上个所以然来,于是继续查找帮助需求答案。在另一个帮助文件中找到了如下信息:

///////////////////////////////////////////////////////////

内置的模式匹配方法提供了一个用于字符串比较的通用工具。下表中展示了可以用于 Like 运算符的通配符,以及与它们匹配的数字和字符串。

pattern 中的字符expression 中的匹配项
? 或 _(下划线) 任何单个字符
* 或 % 零个或多个字符
# 任何单个数字 (0— 9)
[charlist] 在 charlist 中的任何单个字符。
[!charlist] 不在 charlist 中的任何单个字符。

可以使用一组由中括号 ([]) 括住的一个或多个字符(charlist)来匹配在 expression 中的任何单个字符,并且 charlist 可以包含大部分 ANSI 字符集中的字符,包括数字在内。可以通过将特定字符如左方括号 ([)、问号 (?)、数字号 (#) 和星号 (*) 包含于方括号内来直接与这些符号自身进行匹配。不能将右方括号用在一个组中以匹配它自身,但可以将它作为单个字符用于组外。

除了括在方括号中的简单字符列表外,charlist 可以通过使用连字符号 (-) 来分隔范围的上界和下界。例如,在 pattern 中使用 [A-Z] 时,如果 expression 中相应的字符包含了任何在 A 到 Z 范围之间的大写字符,就能实现匹配。可以在方括号中包含多个范围而不必为范围划界。例如,[a-zA-Z0-9] 可以匹配任何字母数字字符。

请注意,ANSI SQL 通配符 (%) 和 (_) 仅在 Microsoft? Jet 4.X 版本和 Microsoft OLE DB Provider for Jet 中才是有效的。如果用在 Microsoft Access 或 DAO 中,那么它们被视为文本。

其他重要的用于模式匹配的规则如下所示:

在 charlist 的开头使用感叹号 (!) 将表示如果在 charlist 以外的任何字符出现在 expression 中,则发生匹配。当它用在方括号的外面时,感叹号匹配它自身。
可以将连字符号 (-) 用于 charlist 的开头(感叹号之后)或末尾以匹配它自身。在其他任何位置中,连字符号标识一个 ANSI 字符范围。
指定了一个字符范围时,字符必须以升序排列出现(A-Z 或 0-100)。[A-Z] 是有效的模式,[Z-A] 是无效模式。
忽略字符顺序 [ ];它被视为一个零长度字符 ("")。
参考地址:http://office.microsoft.com/zh-cn/assistance/HP010322842052.aspx

///////////////////////////////////////////////////////////////

至此,原因总算是找到了,由于本人在Access中使用通配符*一切正常,换成%则不能成功。而C#中则只是支持%通配符,而换成*则会出错!这个问题算不算是一个兼容性问题呢?

通配符:

通配符 描述 示例
% 包含零个或更多字符的任意字符串。 Where title LIKE '%computer%' 将查找处于书名任意位置的包含单词 computer 的所有书名。
_(下划线) 任何单个字符。 Where au_fname LIKE '_ean' 将查找以 ean 结尾的所有 4 个字母的名字(Dean、Sean 等)。
[ ] 指定范围 ([a-f]) 或集合 ([abcdef]) 中的任何单个字符。 Where au_lname LIKE '[C-P]arsen' 将查找以arsen 结尾且以介于 C 与 P 之间的任何单个字符开始的作者姓氏,例如,Carsen、Larsen、Karsen 等。
[^] 不属于指定范围 ([a-f]) 或集合 ([abcdef]) 的任何单个字符。 Where au_lname LIKE 'de[^l]%' 将查找以 de 开始且其后的字母不为 l 的所有作者的姓氏。

将通配符作为文字使用

可以将通配符模式匹配字符串用作文字字符串,方法是将通配符放在括号中。下表显示了使用 LIKE 关键字和 [ ] 通配符的示例。

符号 含义
LIKE '5[%]' 5%
LIKE '[_]n' _n
LIKE '[a-cdf]' a、b、c、d 或 f
LIKE '[-acdf]' -、a、c、d 或 f
LIKE '[ [ ]' [
LIKE ']' ]
LIKE 'abc[_]d%' abc_d 和 abc_de
LIKE 'abc[def]' abcd、abce 和 abcf

使用 ESCAPE 子句的模式匹配

可搜索包含一个或多个特殊通配符的字符串。例如,customers 数据库中的 discounts 表可能存储含百分号 (%) 的折扣值。若要搜索作为字符而不是通配符的百分号,必须提供 ESCAPE 关键字和转义符。例如,一个样本数据库包含名为 comment 的列,该列含文本 30%。若要搜索在 comment 列中的任何位置包含字符串 30% 的任何行,请指定由 Where comment LIKE '%30!%%' ESCAPE '!' 组成的 Where 子句。如果不指定 ESCAPE 和转义符,SQL Server 将返回所有含字符串 30 的行。

下例说明如何在 pubs 数据库 titles 表的 notes 列中搜索字符串"50% off when 100 or more copies are purchased":

Select notes FROM titles Where notes LIKE '50%% off when 100 or more copies are purchased' ESCAPE '%'

(0)

相关推荐

  • C#适用于like语句的SQL格式化函数

    本文实例讲述了C#适用于like语句的SQL格式化函数,分享给大家供大家参考. 具体实现代码如下: 复制代码 代码如下: /// <summary> /// 对字符串进行sql格式化,并且符合like查询的格式. /// </summary> /// <param name="str">要转换的字符串</param> /// <returns>格式化后的字符串</returns> public static str

  • SQL中代替Like语句的另一种写法

    比如查找用户名包含有"c"的所有用户, 可以用 use mydatabase select * from table1 where username like'%c%" 下面是完成上面功能的另一种写法: use mydatabase select * from table1 where charindex('c',username)>0 这种方法理论上比上一种方法多了一个判断语句,即>0, 但这个判断过程是最快的, 我想信80%以上的运算都是花在查找字 符串及其它

  • sql语句like多个条件的写法实例

    表A  no name 1   lu,li,zhang  2   zhou,wei,liu  3   li,fang  表B  no name  sex 1   li          1 2   lu         0 3   zhou    0 4   zhang  1 怎么实现 复制代码 代码如下: select * from A where A.name like (select B.name from B where B.sex=1) ------------------------

  • sql语句中like的用法详细解析

    在SQL结构化查询语言中,LIKE语句有着至关重要的作用.LIKE语句的语法格式是:select * from 表名 where 字段名 like 对应值(子串),它主要是针对字符型字段的,它的作用是在一个字符型字段列中检索包含对应子串的. 假设有一个数据库中有个表table1,在table1中有两个字段,分别是name和sex二者全是字符型数据.现在我们要在姓名字段中查询以"张"字开头的记录,语句如下:select * from table1 where name like &quo

  • 利用reverse索引优化like语句的方法详解

    前言 在有一些情况下,开发同学经常使用like去实现一些业务需求,当使用like时,我们都知道使用like 前%(like '%111')这种情况是无法使用索引的,那么如何优化此类的SQL呢,下面是一个案例. 原SQL如下: pcc_cust_infonew 表索引如下 执行设计如下: 这里可以看到SQL执行3.96秒,执行计划中也可以发现PCC_CUST_INFONEW表走TABLE ACCESS FULL扫描,返回约380k的数据,然后再与PCC_CUST_CONTRACTCOMPANY表主

  • SQL查询语句通配符与ACCESS模糊查询like的解决方法

    ACCESS的通配符和SQL SERVER的通配符比较===================================================ACCESS库的通配符为:*   与任何个数的字符匹配?   与任何单个字母的字符匹配 SQL Server中的通配符为:% 与任何个数的字符匹配_ 与单个字符匹配正文我今天在写个页面的时候,也很郁闷,表中明明有记录,但在ASP里就是搜索不到,理论的sql语句如下:Select * FROM t_food Where t_food.name

  • SQL判断语句用法和多表查询

    1.格式化时间sql语句 本例中本人随便做了两张表,和实际不是很相符,只是想说明sql语句的写法. 例1表格式如下: 需求:查询出本表,但需要使time字段的时间格式为yyyy-MM-dd,比如:2013-08-13 sql写法: SELECT u.id,u.userId,u.timeType,DATE_FORMAT(time,'%Y-%m-%d') AS time,secondId FROM `user` u 运行结果: 2.多表查询(三表查询) 例二三表结构如下: 需求:查询出主表,要求在主

  • thinkphp多表查询两表有重复相同字段的完美解决方法

    框架:thinkphp 版本:3.2.3 内容:查询语句 解决问题:重复字段问题 $Data = M('a')->where($where) ->Field('a.name as aname,b.name as uname,a.*') ->join('b on b.jb_id=a.id') ->order('a.id desc') ->select(); 解释:a.* 查询a表所有的字段 a.name as aname 转换a表中的name重复字段为aname 以上就是小编为

  • mysql 导出select语句结果到excel文件遇到问题及解决方法

    一.导出数据外部 1)mysql连接+将查询结果输出到文件.在命令行中执行(windows的cmd命令行,mac的终端) mysql -hxx -uxx -pxx -e "query statement" db > file -h:后面跟的是链接的host(主机) -u:后面跟的是用户名 -p:后面跟的是密码 db:你要查询的数据库 file:你要写入的文件,绝对路径 例如: 下面将 sql语句 select * from edu_iclass_areas 的查询结果输出到了 /

  • 安装sql server 2008时的4个常见错误和解决方法

    可能由于操作系统不同,或者在安装SQL 2008的时候已经安装SQL其他版本,因此可能会遇到问题,那么这时我们的实际经验和动手测试的能力也是非常重要的,这样才能少走弯路. 问题1:安装sql server 2008 R2,安装过程中提示错误:此计算机上安装了 Microsoft Visual Studio 2008 的早期版本.请在安装 SQL Server 2008 前将 Microsoft Visual Studio 2008 升级到 SP1. 之前我的电脑上确实装了vs2008,于是我准

  • sql server定时作业调用Kettle job出错的快速解决方法

    错误信息: Unable to list jar files in plugin folder 'C:\Windows\system32\config\systemprofile\.kettle\plugins' Unable to get VFS File object for filename 'C:\Windows\system32\config\systemprofile\.kettle\plugins' : Could not find file with URI "C:\Window

  • Access模糊查询查不到数据的解决方法

    一般我们在程序里写模糊查询时都是写成如下这样: Select * from table where txtTitle like '%我们%' 不管连接的数据库是ACCESS还是SQL Server 但是最近写程序时总出现语句正确,但就是出不来结果的情况,比如:手动简单设置服务器安全,及引发的思考,这里提到我写服务查询时总是出不来结果的情况,时间长了,出这问题多了,我发现一个问题,如果按上面的写法写到程序里都是正确的,但是如果用ACCESS里的"查询"功能时会发现,同样的代码却运行不了,

  • Mybatis 查询语句条件为枚举类型时报错的解决

    目录 Mybatis查询语句条件为枚举类型报错 通常这个错误是 Mybatis处理枚举类型 1.枚举 2.包含枚举的实体类 3.书写枚举处理器 4.配置枚举处理器 5.dao层 6.mapper文件 7.测试 Mybatis查询语句条件为枚举类型报错 通常我们对于数据库中一些枚举字段使用tinyInt类型,而java对象对应的字段很多时候会为了方便定义成short或者int.但这样显然不美观方便,让后面维护的人抠破脑袋找你的常量定义在哪儿,要是没有注释简直让人崩溃.时间久后,没有人知道这里面的值

  • mysql查询语句通过limit来限制查询的行数

    mysql查询语句,通过limit来限制查询的行数. 例如: select name from usertb where age > 20 limit 0, 1; //限制从第一条开始,显示1条 select name from usertb where age > 20 limit 1; //同上面的一个效果 select name from usertb where age > 20 limit 4, 1; //显示从第五条开始,显示1条

  • MySQL 查询速度慢与性能差的原因与解决方法

    一.什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS: QueriesPerSecond意思是"每秒查询率",是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准. TPS: 是 TransactionsPerSecond的缩写,也就是事务数/秒.它是软件测试结果的测量单位.客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数. Tips: 最好不要在主库上数据库备

随机推荐