来源: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的零个或多个尾随空格。
  • 此时应该注意charnchar类型,因为不足长度时会自动添加尾随空格,有可能出现问题

测试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. 陕西师范大学第七届程序设计竞赛网络同步赛 J 黑猫的小老弟【数论/法拉数列/欧拉函数】

    链接:https://www.nowcoder.com/acm/contest/121/J来源:牛客网 题目描述 大家知道,黑猫有很多的迷弟迷妹,当然也有相亲相爱的基友,这其中就有一些二五仔是黑猫的小 ...

  2. 在sae中运行web.py应用

    sae 是新浪推出的PaaS业务,可以提供免运维的容器服务,官方网站( https://www.sinacloud.com/ ) 假设您已经在本地开发好了web.py 应用,您可以通过github客户 ...

  3. Tarjan缩点【p4819】[中山市选]杀人游戏

    Description 一位冷血的杀手潜入Na-wiat,并假装成平民.警察希望能在\(N\)个人里面,查出谁是杀手.警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识的人,谁是杀 ...

  4. 状压DP【p1896】[SCOI2005]互不侵犯

    Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包 ...

  5. Spoj SUBLEX - Lexicographical Substring Search

    Dicription Little Daniel loves to play with strings! He always finds different ways to have fun with ...

  6. java随机生成字符串(字符随机生成类 生成随机字符组合)

    原文:http://www.jb51.net/article/45006.htm package p2p_web; import java.util.ArrayList; import java.ut ...

  7. GTK+重拾--09 GTK+中的组件(一)

    (一):写在前面 在这篇文章中主要介绍了GTK+程序中的各种构件,这是解说构件的第一个部分,另外一部分将在下一个小节中讲到. 构件是建立一个GUI程序的基础.在GTK+的长期发展过程中.一些特定的构件 ...

  8. 一个人的安全部之ELK接收Paloalto日志并用钉钉告警

    起因 通报漏洞后,开发未能及时修复漏洞,导致被攻击,领导说我发现被攻击的时间晚了,由于一个人安全部精力有限未能及时看IPS告警,于是做了个钉钉告警. 本人环境介绍 ubuntu 14.04 pytho ...

  9. 在使用springMVC时,我使用了@Service这样的注解,发现使用注解@Transactional声明的事务不起作用

    问题出现的场景: 在使用spring mvc时,我使用了@Service这样的注解, 发现使用注解@Transactional声明的事务不起作用. 我的配置如下: <mvc:annotation ...

  10. vim+python

    #!/bin/bash # install fisa vim config echo '===============================' echo 'start to install ...