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的注释中说的
很清楚了。
 

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

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

sql查询语句中用like中用参数化查询

今天终于学会怎么在like中用参数化查询啦。。哈哈。。再也不用担心sql注入了。。。...
  • niunan
  • niunan
  • 2016年07月23日 18:47
  • 3859

like查询特殊字符,用转义符处理

like中查询的字符串中有特殊字符,如:'_','%'该怎么查询。 理论 Oracle数据库中escape用来定义转义符,在转义符后加一个通配符,表示将该通配符变为普通字符。e...
  • windsna
  • windsna
  • 2014年08月13日 14:40
  • 2587

SQL中like语句通配符、转义符与括号的使用

可以搜索通配符字符。有两种方法可指定平常用作通配符的字符: 使用 ESCAPE 关键字定义转义符。在模式中,当转义符置于通配符之前时,该通配符就解释为普通字符。例如,要搜索在任意位置包含字符串 5...
  • kpchen_0508
  • kpchen_0508
  • 2015年04月21日 10:47
  • 5863

DB2中like使用

DB2中的like的使用是有限制的,它后面不能跟一个变量或者是字段,因此,在存储过程或SQL语句中就不能like一个变量或一个字段。比如有两个表A(a,b,c,d),B(a,b,c,d)。普遍的用法是...
  • ganlange
  • ganlange
  • 2009年11月28日 14:49
  • 5670

数据库查询LIKE %XX%性能问题

对于LIKE%XX%这样的查询,相信很多人都会比较头疼。 因为大多数情况下,我们是无法用LIKEXX%来替代全模糊匹配的。 最近针对项目中这种情况,我们采取了全文搜索与关系型数据库结合查询的方式。 以...
  • Carson0116
  • Carson0116
  • 2017年11月26日 22:55
  • 125

sql语句where子句like的用法详解

在SQL结构化查询语言中,LIKE语句有着至关重要的作用。 LIKE语句的语法格式是:select * from 表名 where 字段名 like 对应值(子串),它主要是针对字符型字段的,它的作...
  • u013045749
  • u013045749
  • 2015年05月16日 10:13
  • 4553

SQL语句--like和正则表达式的使用

【LIKE子句】 LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。 LIKE 子句中使用 ’ % ‘ 字符来表示0个或多个字符,实现模糊匹配。如果没有使用 ‘ % ’ , LIKE 子...
  • sinat_26230689
  • sinat_26230689
  • 2016年09月01日 17:49
  • 3437

C# SQL语句参数化,通过包含like关键字的子句查询无结果问题

问题描述:SQL语句使用参数传递变量值,如果where子句中含有like关键字并使用sql的标准语法 like '%@parma%',则查询无数据或者报错 解决办法:sql语句中like部分修改为 l...
  • wangzl1163
  • wangzl1163
  • 2016年05月11日 17:32
  • 893

MyBatis的like语句防止sql注入的例子。

类似的sql语句配置如下: t.DR=0 and a.DR=0 and t.VSTATUS>=1 and t.XM like '%${xm}%'                       ...
  • suyu_yuan
  • suyu_yuan
  • 2016年11月15日 10:46
  • 1014
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL中使用LIKE查询注意的问题
举报原因:
原因补充:

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