来源:https://blog.guoqianfan.com/2019/01/27/how-to-use-like-and-patindex-in-sqlserver/

在SQL Server中,能使用通配符的只有2个:LIKE、PATINDEX。

不过LIKE支持2种通配符转义,无限制最全面;而PATINDEX只支持最简单的通配符转义([]转义),限制较多。

LIKE

LIKE 是逻辑运算符,能使用通配符,并且支持2种方法来转义通配符。

语法

match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]

[ XX ]代表是可选的,所以可以没有转义表达式ESCAPE escape_character。

参数

  • match_expression

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

  • pattern

    要在 match_expression 中搜索并且可以包括下列有效通配符的特定字符串。 pattern 的最大长度可达 8,000 字节。

    • %:包含零个或多个字符的任意字符串。

    • _(下划线):任何单个字符。

    • [ ]:指定范围 ([a-f]) 或集合 ([abcdef]) 中的任何单个字符。数字同样支持范围或集合([0-9]或[0123456789])。

      在范围搜索中,范围包含的字符可能因排序规则的排序规则而异。

    • [^]:不属于指定范围 ([a-f]) 或集合 ([abcdef]) 的任何单个字符。数字同样支持。

  • escape_character

    放在通配符之前用于指示通配符应当解释为常规字符而不是通配符的字符。 escape_character 是字符表达式,无默认值,并且计算结果必须仅为一个字符。

结果类型

Boolean

结果值

如果 match_expression 与指定的 pattern 相匹配,则 LIKE 返回 TRUE。

备注

何时忽略尾随空格

  • pattern里有空格时必须匹配!
  • pattern里无空格时会忽略match_expression的零个或多个尾随空格。
  • 此时应该注意char、nchar类型,因为不足长度时会自动添加尾随空格,有可能出现问题。

测试sql如下:

--pattern里有空格时必须匹配
select 1 where '123' like '123 ';
--无 --pattern里无空格时会忽略match_expression的【尾随】空格
select 1 where '123 ' like '123';
--1 --pattern里无空格时【不会】忽略match_expression的【前置】空格
select 1 where ' 123' like '123';
--无

否定的几种形式

相等

'xx' NOT LIKE 'yy' = NOT 'xx' LIKE 'yy'

不相等

NOT LIKE 'dm%' != LIKE '[^d][^m]%'

  • NOT LIKE 'dm%':结果可以是:da、tm...

  • LIKE '[^d][^m]%':会排除掉所有以 d 开始或第二个字母为 m 的名称。

    这是因为用反向通配符匹配字符串是分步骤进行计算的,一次一个通配符。如果在计算过程中任一环节匹配失败,那么就会将其消除。

通配符的转义

通配符当做普通字符来使用,有2种方式。

使用[]

[]这种方式只适合简单的情况,有很多限制,不推荐。

能转义的字符有:百分号 (%)、下划线 (_) 和左括号 ([) ,其他的转义不了,或者只能特殊情况下使用(例如短横线-只有在首位时才被视为普通字符)。如果强行使用[]来转义会导致结果错误!!推荐使用ESCAPE子句来进行转义。

使用ESCAPE子句

ESCAPE子句本来就是为转义而生,推荐使用。

ESCAPE子句的转义字符是自定义的,定义为某字符,pattern里就使用这个转义字符来转义即可。

相关sql如下:

--转义【%】
select 1 where '%123' like '\%123' ESCAPE '\'
--1 --转义【_】
select 1 where '123_' like '123\_' ESCAPE '\'
--1 --转义【[^]】
select 1 where '123[^]' like '123\[\^\]' ESCAPE '\'
--1 --自定义其他转义字符:%
select 1 where '123[^]%_' like '123%[%^%]%%%_' ESCAPE '%'
--1

PATINDEX

PATINDEX 属于字符串函数,支持通配符,转义通配符只能使用[],所以限制颇多。

PATINDEX 返回模式在指定表达式中第一次出现的起始位置(从1开始);如果在所有有效的文本和字符数据类型中都找不到该模式,则返回零。

语法

PATINDEX ( '%pattern%' , expression )

参数

  • pattern

    包含要查找的序列的字符表达式(和LIKE的pattern参数一样)。可以使用通配符;但 pattern 之前和之后必须有 % 字符(搜索第一个或最后一个字符时除外)。 pattern 是字符串数据类型类别的表达式。 pattern 最多包含 8000 个字符。

  • expression

    是一个表达式,通常是针对指定模式搜索的列。 expression 属于字符串数据类型类别。

返回类型

如果 expression 的数据类型为 varchar(max) 或 nvarchar(max),则返回 bigint;否则返回 int。

结果值

返回模式在指定表达式中第一次出现的起始位置(从1开始);如果在所有有效的文本和字符数据类型中都找不到该模式,则返回零。

备注

  • 如果 pattern 或 expression 为 NULL,则 PATINDEX 返回 NULL。

  • PATINDEX虽然支持通配符,但是转义通配符只能使用[]!所以限制颇多。

  • 在 PATINDEX 中可以使用 COLLATE 函数显式指定要搜索的表达式的排序规则。示例sql如下:

    USE tempdb;
    GO
    SELECT PATINDEX ( '%ein%', 'Das ist ein Test' COLLATE Latin1_General_BIN) ;
    GO

参考

  1. LIKE (Transact-SQL):https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2012/ms179859(v%3Dsql.110)
  2. PATINDEX (Transact-SQL):https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2012/ms188395(v%3Dsql.110)

SQL Server中LIKE和PATINDEX的用法的更多相关文章

  1. SQL Server 中 with tmp 临时表的用法

    SQL Server 中 with tmp 临时表的用法 ----------with临时表用法,有时候采用临时表比采用in的效率更高,避免了全表扫描. 实例中实现了查询普通题.大题.子题目的sql ...

  2. SQL Server中Rowcount与@@Rowcount的用法 和set nocount on 也会更新@@Rowcount

    rowcount的用法: rowcount的作用就是用来限定后面的sql在返回指定的行数之后便停止处理,比如下面的示例, set rowcount 10select * from 表A 这样的查询只会 ...

  3. SQL Server中row_number函数的简单用法

    一.SQL Server Row_number函数简介   ROW_NUMBER()是一个Window函数,它为结果集的分区中的每一行分配一个连续的整数. 行号以每个分区中第一行的行号开头. 以下是R ...

  4. SQL Server中Rowcount与@@Rowcount的用法

    rowcount的用法: rowcount的作用就是用来限定后面的sql在返回指定的行数之后便停止处理,比如下面的示例, set rowcount 10select * from 表A 这样的查询只会 ...

  5. 转载——SQL Server中Rowcount与@@Rowcount的用法

    转载自:http://www.lmwlove.com/ac/ID943 rowcount的用法: rowcount的作用就是用来限定后面的sql在返回指定的行数之后便停止处理,比如下面的示例, set ...

  6. Sql Server中charindex、patindex的区别

    SQL代码如下: select charindex('1,','121,1,1234') select patindex('%1,%','121,1,1234') ','121,1,1234') se ...

  7. SQL Server 中的SET XACT_ABORT各种用法及显示结果

      源地址:http://www.cnblogs.com/rob0121/articles/2320932.html 点击进入 默认行为:默认为SET XACT_ABORT OFF,没有事务行为. S ...

  8. SQL Server中变量的声明和使用方法

    网址:http://blog.sina.com.cn/s/blog_63d0c97a0100qpy7.html 声明局部变量语法: DECLARE @variable_name DataType 其中 ...

  9. SQL SERVER 中 GO 的用法2

    具体不废话了,请看下文详解. 1 2 3 4 5 6 7 8 9 10 use db_CSharp go  select *,  备注=case  when Grade>=90 then '成绩 ...

随机推荐

  1. Selenium2+python自动化12-操作元素(键盘和鼠标事件)【转载】

    前言 在前面的几篇中重点介绍了一些元素的到位方法,到位到元素后,接下来就是需要操作元素了.本篇总结了web页面常用的一些操作元素方法,可以统称为行为事件 有些web界面的选项菜单需要鼠标悬停在某个元素 ...

  2. android 使用 LocalStorage

    PS:本身是.net 出身 因为项目需要 研究了好几天安卓 这个方法网上也有 自己也写出来 有时间自己看看 和 给还没有解决问题的朋友借鉴下,下面有标个重点 是允许使用localstorage 的关键 ...

  3. js部分的总结

    一.词法结构 1.区分大小写 2.注意//单行/*多行注释* 3.字面量(直接量 literal) 12 //数字 5.8 //小数 “hello” ‘hello’ true /js/gi  //正则 ...

  4. SQL表操作习题2 1~10题

  5. command for ContextMenu in DataTemplate

    准备教程. 1. 无难度方式 <DataTemplate x:Key="DataTemplate1"> <StackPanel  > <toolkit ...

  6. Eclipse使用Debug模式调试Spring Boot项目时跳转到exitCurrentThread的问题

    Spring Boot项目使用了spring-boot-devtools工具且在Eclipse中Debug调试会自动跳转到这个方法: public static void exitCurrentThr ...

  7. 我的一次Postgre数据库Insert 、Query性能优化实践

    一.前言 以前的系统由于表设计比较复杂(多张表,表与表直接有主从关系),这个是业务逻辑决定的. 插入效率简直实在无法忍受,必须优化.在了解了Postgre的Copy,unlogged table 特性 ...

  8. Delphi CRC16校验算法实现(转)

    循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC.它是利用除法及余数的原理来作错误侦测(Error Detecting)的.实际应用时,发送装置计算出CRC值并随 ...

  9. Android使用 SO 库时要注意的一些问题

    常和 SO 库开发打交道的同学来说已经是老生长谈,但是既然要讨论一整个动态加载系列,我想还是有必要说说使用 SO 库时的一些问题. 在项目里使用 SO 库非常简单,在 加载 SD 卡中的 SO 库 中 ...

  10. Android如何缓存你的BITMAP对象

    在app中通常最占内存.占流量的元素就是图片了,图片往往又无处不在,特别是伴随着list,GridView或者ViewPager出现,这些图片随着你的滑动操作,时而出现在你的屏幕中,时而消失在屏幕之外 ...