SQL中使用LIKE查询注意的问题

转载 2007年09月14日 18:20:00

使用Like关键字可以实现模糊查询,有下面4种通配符:

通配符 描述 示例
% 包含零个或更多字符的任意字符串。 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 进行字符串比较时,模式字符串中的所有字符都有意义,包括起始或尾随空格。如果查询中的比较要返回包含"abc "(abc 后有一个空格)的所有行,则将不会返回包含"abc"(abc 后没有空格)的列所在行。但是可以忽略模式所要匹配的表达式中的尾随空格。如果查询中的比较要返回包含"abc"(abc 后没有空格)的所有行,则将返回以"abc"开始且具有零个或多个尾随空格的所有行。

由于数据存储方式的原因,使用包含 char varchar 数据模式的字符串比较可能无法通过 LIKE 比较。了解每种数据类型的存储方式以及导致 LIKE 比较失败的原因十分重要。下面的示例将局部 char 变量传递给存储过程,然后使用模式匹配查找某个作者的所有著作。在此过程中,作者的姓将作为变量传递。

CREATE PROCEDURE find_books @AU_LNAME char(20)
AS
SELECT @AU_LNAME = RTRIM(@AU_LNAME) + '%'
SELECT t.title_id, t.title
FROM authors a, titleauthor ta, titles t
WHERE a.au_id = ta.au_id AND ta.title_id = t.title_id
AND a.au_lname LIKE @AU_LNAME

当名字中包含的字符数小于 20 时,char 变量 (@AU_LNAME) 将包含尾随空格,这导致 find_books 过程中没有行返回。由于 au_lname 列为 varchar 类型,所以没有尾随空格。因为尾随空格是有意义的,所以此过程失败。

但下面的示例是成功的,因为尾随空格没有被添加到 varchar 变量中:

USE pubs
GO
CREATE PROCEDURE find_books2 @au_lname varchar(20)
AS
SELECT t.title_id, t.title
FROM authors a, titleauthor ta, titles t
WHERE a.au_id = ta.au_id AND ta.title_id = t.title_id
AND a.au_lname LIKE @au_lname + '%'
EXEC find_books2 'ring'

说明白一点就是使用LIKE关键字的时候,参数不要使用char型的数据,这会是输入的数据带有尾随空格,从而使查询失败。

对上面存储过程中出现的 “RTRIM”函数的解释如下:

RTRIM

截断所有尾随空格后返回一个字符串。

语法

RTRIM ( character_expression )

参数

character_expression

由字符数据组成的表达式。character_expression 可以是常量、变量,也可以是字符或二进制数据的列。

返回类型

varchar

注释
character_expression 必须为可隐性转换为 varchar 的数据类型。否则请使用 CAST 函数显式转换 character_expression
示例

下例显示如何使用 RTRIM 删除字符变量中的尾随空格。

DECLARE @string_to_trim varchar(60)
SET @string_to_trim = 'Four spaces are after the period in this sentence. '
SELECT 'Here is the string without the leading spaces: ' + CHAR(13) +
RTRIM(@string_to_trim)
GO
我的解释是:RTRIM可以将varchar型数据中的尾随空格去掉然后存在一个varchar型数据中,
而不可以将一个char型数据中的尾随空格去掉存在一个varchar型数据中。要先将char型数据
显式转换成varchar型数据,然后再用RTRIM来去掉尾随空格。这一点在RTRIM的注释中说的
很清楚了。
 

相关文章推荐

在方法体上和在方法体里使用synchronized的区别

学习synchronized时,我们可以把synchronized放在方法体上,也可以放在方法体内 拿servlet来说,如果放在方法体上,就会把后面的request阻塞掉: protec...

Redis在集群环境中生成唯一ID

概述设计目标:每秒最大生成10万个ID,ID单调递增且唯一。Reidis可以不需要持久化ID。 要求:集群时钟不能倒退。 总体思路:集群中每个节点预生成生成ID;然后与redis的已经存在的ID做...

Sql语句中,Contains与Like查询结果不相同的问题

我们知道,要模糊查询数据表的话,一般会用到Like语法,而对数据表相应的字段进行全文索引之后,还可以使用速度更快的Contains方法、 但是,我发现,分别使用这两个方法查询出来的结果不一致! ...

SQL使用Like模糊查询

  • 2008年08月02日 19:30
  • 124KB
  • 下载

sql语句中条件查询like的效率,及使用规范.

引用“ 我在做数据库查询的时候,发现了一个奇怪的问题,在使用like关键字的时候,速度其慢,效率极低。不明白是什么原因,请大家讲解一下,为什么like慢,而其他的两个快。3个查询不同的地方用红色...

oracle sql语言模糊查询--通配符like的使用教程

oracle在Where子句中,可以对datetime、char、varchar字段类型的列用Like子句配合通配符选取那些“很像...”的数据记录,以下是可使用的通配符: %   零或者多个字符 ...
  • lqh4188
  • lqh4188
  • 2013年08月20日 09:22
  • 759

oracle sql语言模糊查询--通配符like的使用教程

oracle在Where子句中,可以对datetime、char、varchar字段类型的列用Like子句配合通配符选取那些“很像...”的数据记录,以下是可使用的通配符: %   零或者多个字符 ...

Oracle模糊查询之(3.2从使用函数和sql语法角度来提高模糊查询效率 二)ORACLE中Like与Instr模糊查询性能大比拼

ORACLE中Like与Instr模糊查询性能大比拼 ORACLE中Like与Instr模糊查询性能大比拼     instr(title,'手册')>0  相当于  title like '%手册...
  • haiross
  • haiross
  • 2013年10月23日 16:50
  • 4452

SQL提高查询效率【in、not in、between、like】等条件讲述

在使用SQL语句查询数据库记录时,如果要查询相同的内容,有着不同的多种方法。   仍然,尽管使用多种方法可以得到相同的结果,但是,如果您使用不同的方法,在执行效益上是截然不同的。因此,我们得仔细考虑...

SQL提高查询效益之in、not in、between、like等条件讲述

本文来自:http://user.qzone.qq.com/651297539?ptlang=2052#!app=2&pos=1337080083 在使用SQL语句查询数据库记录时,如果要查询相同的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL中使用LIKE查询注意的问题
举报原因:
原因补充:

(最多只允许输入30个字)