sql 数据的like查询条件

数据|条件

LIKETransact-SQL 参考LIKE
确定给定的字符串是否与指定的模式匹配。模式可以包含常规字符和通配符字符。模式匹配过程中,常规字符必须与字符串中指定的字符完全匹配。然而,可使用字符串的任意片段匹配通配符。与使用 = 和 != 字符串比较运算符相比,使用通配符可使 LIKE 运算符更加灵活。如果任何参数都不属于字符串数据类型,Microsoft SQL Server 会将其转换成字符串数据类型(如果可能)。
语法
match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]
参数
match_expression

任何字符串数据类型的有效 SQL Server 表达式。

pattern

match_expression 中的搜索模式,可以包含下列有效 SQL Server 通配符。
通配符描述示例%包含零个或更多字符的任意字符串。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 的所有作者的姓氏。

escape_character

字符串数据类型分类中的所有数据类型的任何有效 SQL Server 表达式。escape_character 没有默认值,且必须仅包含一个字符。
结果类型
Boolean
结果值
如果 match_expression 匹配指定模式,LIKE 将返回 TRUE。
注释
当使用 LIKE 进行字符串比较时,模式字符串中的所有字符都有意义,包括起始或尾随空格。如果查询中的比较要返回包含"abc "(abc 后有一个空格)的所有行,则将不会返回包含"abc"(abc 后没有空格)的列所在行。但是可以忽略模式所要匹配的表达式中的尾随空格。如果查询中的比较要返回包含"abc"(abc 后没有空格)的所有行,则将返回以"abc"开始且具有零个或多个尾随空格的所有行。

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

CREATE PROCEDURE find_books @AU_LNAME char(20)ASSELECT @AU_LNAME = RTRIM(@AU_LNAME) + '%'SELECT t.title_id, t.title FROM authors a, titleauthor ta, titles tWHERE 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 pubsGOCREATE PROCEDURE find_books2 @au_lname varchar(20)ASSELECT t.title_id, t.title FROM authors a, titleauthor ta, titles tWHERE a.au_id = ta.au_id AND ta.title_id = t.title_id AND a.au_lname LIKE @au_lname + '%'EXEC find_books2 'ring'

下面是结果集:

title_id title -------- ---------------------------------------------------------------MC3021 The Gourmet Microwave PS2091 Is Anger the Enemy? PS2091 Is Anger the Enemy? PS2106 Life Without Fear (4 row(s) affected)
使用 LIKE 的模式匹配
当搜索 datetime 值时,推荐使用 LIKE,因为 datetime 项可能包含各种日期部分。例如,如果将值 19981231 9:20 插入到名为 arrival_time 的列中,则子句 WHERE arrival_time = 9:20 将无法找到 9:20 字符串的精确匹配,因为 SQL Server 将其转换为 1900 年 1 月 1 日上午 9:20。然而,子句 WHERE arrival_time LIKE '%9:20%' 将找到匹配。

LIKE 支持 ASCII 模式匹配和 Unicode 模式匹配。当所有参数,包括 match_expression、pattern 和 escape_character(如果有)都是 ASCII 字符数据类型时,将执行 ASCII 模式匹配。如果其中任何参数属于 Unicode 数据类型,则所有参数将被转换为 Unicode 并执行 Unicode 模式匹配。当对 Unicode 数据(nchar 或 nvarchar 数据类型)使用 LIKE 时,尾随空格是有意义的。但是对于非 Unicode 数据,尾随空格没有意义。Unicode LIKE 与 SQL-92 标准兼容。ASCII LIKE 与 SQL Server 的早期版本兼容。

下面的一系列示例显示 ASCII LIKE 模式匹配与 Unicode LIKE 模式匹配所返回的行之间的差异:

-- ASCII pattern matching with char columnCREATE TABLE t (col1 char(30))INSERT INTO t VALUES ('Robert King')SELECT * FROM t WHERE col1 LIKE '% King' -- returns 1 row-- Unicode pattern matching with nchar columnCREATE TABLE t (col1 nchar(30))INSERT INTO t VALUES ('Robert King')SELECT * FROM t WHERE col1 LIKE '% King' -- no rows returned-- Unicode pattern matching with nchar column and RTRIMCREATE TABLE t (col1 nchar (30))INSERT INTO t VALUES ('Robert King')SELECT * FROM t WHERE RTRIM(col1) LIKE '% King' -- returns 1 row

说明  如果使用 LIKE 进行字符串比较,模式字符串中的所有字符都有意义,包括起始空格或尾随空格。

使用 % 通配符
如果指定 LIKE '5%',SQL Server 将搜索后面带有零个或多个任意字符的数字 5。

例如,此查询将显示数据库中所有的系统表,因为它们都以字母 sys 开始:

SELECT TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE TABLE_NAME LIKE 'sys%'

说明  请注意:系统表可以随版本不同而更改。推荐使用信息架构视图或适用的存储过程处理 SQL Server 系统表。

若要查阅非系统表的所有对象,请使用 NOT LIKE 'sys%'。如果共有 32 个对象且 LIKE 找到 13 个与模式匹配的名称,则 NOT LIKE 将找到 19 个与 LIKE 模式不匹配的对象。

使用 LIKE '[^s][^y][^s]%' 模式不一定每次找到的名称都相同。可能仅得到 14 个名称(而不是 19 个),除了系统表名称外,所有以 s 开始或第二个字母为 y 或第三个字母为 s 的名称也都将从结果中消除。这是因为用反向通配符匹配字符串是分步骤进行计算的,一次一个通配符。如果在计算过程中任一环节匹配失败,那么就会将其消除。
将通配符作为文字使用
可以将通配符模式匹配字符串用作文字字符串,方法是将通配符放在括号中。下表显示了使用 LIKE 关键字和 [ ] 通配符的示例。
符号含义LIKE '5[%]'5%LIKE '[_]n'_nLIKE '[a-cdf]'a、b、c、d 或 fLIKE '[-acdf]'-、a、c、d 或 fLIKE '[ [ ]'[LIKE ']']LIKE 'abc[_]d%'abc_d 和 abc_deLIKE '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":

USE pubsGOSELECT notesFROM titlesWHERE notes LIKE '50%% off when 100 or more copies are purchased' ESCAPE '%'GO
示例A. 使用带 % 通配符的 LIKE
下例查找 authors 表中所有区号为 415 的电话号码。

USE pubsGOSELECT phoneFROM authorsWHERE phone LIKE '415%'ORDER by au_lnameGO

下面是结果集:

phone ------------ 415 658-9932 415 548-7723 415 836-7128 415 986-7020 415 836-7128 415 534-9219 415 585-4620 415 354-7128 415 834-2919 415 843-2991 415 935-4228 (11 row(s) affected)
B. 使用带 % 通配符的 NOT LIKE
下例查找 authors 表中所有区号不是 415 的电话号码。

USE pubsGOSELECT phoneFROM authorsWHERE phone NOT LIKE '415%'ORDER BY au_lnameGO

下面是结果集:

phone ------------ 503 745-6402 219 547-9982 615 996-8275 615 297-2723 707 938-6445 707 448-4982 408 286-2428 301 946-8853 801 826-0752 801 826-0752 913 843-0462 408 496-7223 (12 row(s) affected)
C. 使用 ESCAPE 子句
下例使用 ESCAPE 子句和转义符查找 mytbl2 表的 c1 列中的精确字符串 10-15%。

USE pubsGOIF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'mytbl2') DROP TABLE mytbl2GOUSE pubsGOCREATE TABLE mytbl2( c1 sysname)GOINSERT mytbl2 VALUES ('Discount is 10-15% off')INSERT mytbl2 VALUES ('Discount is .10-.15 off')GOSELECT c1 FROM mytbl2WHERE c1 LIKE '%10-15!% off%' ESCAPE '!'GO
D. 使用 [ ] 通配符
下例查找名字为 Cheryl 或 Sheryl 的作者。

USE pubsGOSELECT au_lname, au_fname, phoneFROM authorsWHERE au_fname LIKE '[CS]heryl'ORDER BY au_lname ASC, au_fname ASCGO

下例查找姓为 Carson、Carsen、Karson 或 Karsen 的作者所在的行。

USE pubsGOSELECT au_lname, au_fname, phoneFROM authorsWHERE au_lname LIKE '[CK]ars[eo]n'ORDER BY au_lname ASC, au_fname ASCGO

请参见

表达式

函数

SELECT

WHERE

时间: 2024-09-19 09:03:26

sql 数据的like查询条件的相关文章

ThinkPHP 3.2.2 框架的模型中where查询条件总结

ThinkPHP_3.2.3 框架的Model,结合官方手册及使用经验汇总出其大体用法: 核心转换方法:     $this->parseWhere($where);    $whereStr .= $this->parseThinkWhere($key, $val);    $this->parseWhereItem($this->parseKey($key), $val);     // 内连接.左连接.右连接 UserModel.class.php    // SQL:( S

hibernate中带查询条件的分页

所谓分页,从数据库中分,则是封装一个分页类.利用分页对象进行分页. 但,分页往往带查询条件.   分页类的三个重要数据:[当前页码数],[数据库中的总记录数],[每页显示的数据的条数] 原理:select * from  [表名] where   [字段名]  like   ['%条件%']    limit  [开始查询的索引],[每页显示的数据]   带查询条件的分页分两步 (1)第一步:查询出符合条件的数据的总条数  ---->select count(*) from [表名] where

SQL数据查询语句

查询是SQL语言的核心,SQL语言只提供唯一一个用于数据库查询的语句,即SELECT语句.用于表达SQL查询的SELECT语句是功能最强也是最复杂的SQL语句,它提供了很多选项和使用方法.SELECT语句的命令格式如下: SELECT查询语句是由七个子句构成,其中SELECT和FROM子句是一个完整SELECT查询语句必须要有的,其它的子句可以根据具体需要任选.上述的每个子句功能说明如下: (1)SELECT子句 列出所有要求SELECT语句进行检索的数据项,这些项可能取自数据库中关系表的列,也

LINQ to SQL运行时动态构建查询条件

在进行数据查询时,经常碰到需要动态构建查询条件.使用LINQ实现这个需求可能会比以前拼接SQL语 句更麻烦一些.本文介绍了3种运行时动态构建查询条件的方法.本文中的例子最终实现的都是同一个功 能,从Northwind数据库Customers表中搜索出CompanyName列带有keywords中任意元素的项.keywords是 个字符串数组,该数组长度在编译时是不确定的.思路及方法说明写在代码注释中. 1.表达式树 1 public static IEnumerable<Customers>

数据-怎样用sql语句,使查询速度更快

问题描述 怎样用sql语句,使查询速度更快 在使用数据库的过程中,经常会有10W条甚至100W条级以上的数据记录,使用常规的sql语句在这种级别的数据库中查询,反馈的速度非常慢,时有几分钟才能得到查询反馈的数据结果:本人曾经看过一个sql语句,能在100W级的数据记录中,只用几秒的时间就得到查询结果,但是现在却不曾记得那条语句是如何写的了,不知哪位大神有类似或者这种技能,能否指点小弟一下 解决方案 1.建立索引 2.优化SQL语句 3.条件精确,使用索引 4.最好使用内部过程 5.只取需要的数据

sql数据查询出现字段为空和不为空相加不等于总数

问题描述 sql数据查询出现字段为空和不为空相加不等于总数 情景是这样,一个原始数据excle表格,数据总数为81439条,复制到数据库中select * from 查询后显示结果为81444,然后根据某个字段为空查询出4条,删除后应该是剩81440条呢! 问题出现了,根据某字段aa为空没有查询出来数据,根据aa不为空缺查出81439条数据,少一条.根据字段bb.cc结果一样,根据字段dd为空查询出数据1条,不为空的是81437.根据aa,bb,cc不为空查出81439条为空却查不出数据. 为什

浅述SQL Server的聚焦强制索引查询条件和Columnstore Index_MsSql

前言 本节我们再来穿插讲讲索引知识,后续再讲数据类型中的日期类型,简短的内容,深入的理解. 强制索引查询条件 前面我们也讲了一点强制索引查询的知识,本节我们再来完整的讲述下 (1)SQL Server使用默认索引 USE TSQL2012 GO SELECT * FROM Sales.Orders 上述就不用我再啰嗦了,使用默认主键创建的聚集索引来执行查询执行计划. (2)SQL Server使用强制索引 USE TSQL2012 GO SELECT custid FROM Sales.Orde

Sql Server 存储过程中查询数据无法使用 Union(All)

原文:Sql Server 存储过程中查询数据无法使用 Union(All) 微软Sql Server数据库中,书写存储过程时,关于查询数据,无法使用Union(All)关联多个查询.     1.先看一段正常的SQL语句,使用了Union(All)查询:      SELECT ci.CustId --客户编号 , ci.CustNam --客户名称 , ci.ContactBy --联系人 , ci.Conacts --联系电话 , ci.Addr -- 联系地址 , ci.Notes --

必须知道的SQL编写技巧,多条件查询不拼字符串的写法

原文:必须知道的SQL编写技巧,多条件查询不拼字符串的写法 在做项目中,我们经常遇到复杂的查询方法,要根据用户的输入,判断某个参数是否合法,合法的话才能当作过滤条件,我们通常的做法是把查询SQL赋值给一个字符串变量,然后根据判断条件动态的拼接where条件进行查询.下面来简单说一下写SQL中遇到的问题和解决办法.   一.不确定字段名,而产生的SQL字符串拼接