SQL Server中LIKE和PATINDEX的用法
来源: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
参考
- LIKE (Transact-SQL):https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2012/ms179859(v%3Dsql.110)
- PATINDEX (Transact-SQL):https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2012/ms188395(v%3Dsql.110)
SQL Server中LIKE和PATINDEX的用法的更多相关文章
- SQL Server 中 with tmp 临时表的用法
SQL Server 中 with tmp 临时表的用法 ----------with临时表用法,有时候采用临时表比采用in的效率更高,避免了全表扫描. 实例中实现了查询普通题.大题.子题目的sql ...
- SQL Server中Rowcount与@@Rowcount的用法 和set nocount on 也会更新@@Rowcount
rowcount的用法: rowcount的作用就是用来限定后面的sql在返回指定的行数之后便停止处理,比如下面的示例, set rowcount 10select * from 表A 这样的查询只会 ...
- SQL Server中row_number函数的简单用法
一.SQL Server Row_number函数简介 ROW_NUMBER()是一个Window函数,它为结果集的分区中的每一行分配一个连续的整数. 行号以每个分区中第一行的行号开头. 以下是R ...
- SQL Server中Rowcount与@@Rowcount的用法
rowcount的用法: rowcount的作用就是用来限定后面的sql在返回指定的行数之后便停止处理,比如下面的示例, set rowcount 10select * from 表A 这样的查询只会 ...
- 转载——SQL Server中Rowcount与@@Rowcount的用法
转载自:http://www.lmwlove.com/ac/ID943 rowcount的用法: rowcount的作用就是用来限定后面的sql在返回指定的行数之后便停止处理,比如下面的示例, set ...
- Sql Server中charindex、patindex的区别
SQL代码如下: select charindex('1,','121,1,1234') select patindex('%1,%','121,1,1234') ','121,1,1234') se ...
- SQL Server 中的SET XACT_ABORT各种用法及显示结果
源地址:http://www.cnblogs.com/rob0121/articles/2320932.html 点击进入 默认行为:默认为SET XACT_ABORT OFF,没有事务行为. S ...
- SQL Server中变量的声明和使用方法
网址:http://blog.sina.com.cn/s/blog_63d0c97a0100qpy7.html 声明局部变量语法: DECLARE @variable_name DataType 其中 ...
- SQL SERVER 中 GO 的用法2
具体不废话了,请看下文详解. 1 2 3 4 5 6 7 8 9 10 use db_CSharp go select *, 备注=case when Grade>=90 then '成绩 ...
随机推荐
- sql多对多探讨
--用sql语句探讨一对多 多对多关系 /**** 你有3个表 学生表(学生id 学生姓名) 课程表(课程id 课程名) 成绩表 (学生id 课程id 分数) 班级表(班级id 学生id) 这里的班 ...
- 计蒜客 18488.Extreme Sort (German Collegiate Programming Contest 2015 ACM-ICPC Asia Training League 暑假第一阶段第三场 E)
E.Extreme Sort 传送门 代码: #include<iostream> #include<cstdio> #include<cstring> #incl ...
- 第十四届华中科技大学程序设计竞赛 B Beautiful Trees Cutting【组合数学/费马小定理求逆元/快速幂】
链接:https://www.nowcoder.com/acm/contest/106/B 来源:牛客网 题目描述 It's universally acknowledged that there'r ...
- Buffer源码深入分析
博客园对MarkDown显示的层次感不是很好,大家可以看这里:Buffeer. 本机环境: Linux 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 18 18:33 ...
- #420 Div2 C
#420 Div2 C 题意 不断把数加入到一个栈里,取数的时候要求按照 1~n 的顺序取数,每次取数保证数一定在栈里,如果要取的数不在栈头,可以选择对栈排序一次.问最少排序几次. 分析 只要栈头的数 ...
- POJ 3470 Walls(线段树+扫描线)
[题目链接] http://poj.org/problem?id=3470 [题目大意] 给出几面墙,均垂直于x轴或者y轴,给出一些鸟的位置(二维坐标点), 鸟只会垂直x轴或者y轴飞行,并且会撞上最近 ...
- lua异常捕获
解析json失败,想要捕获异常,可以使用pacll local cjson = require("cjson") local str = '[{"name":& ...
- 事件溯源模式(Event Sourcing Pattern)
此文翻译自msdn,侵删. 原文地址:https://msdn.microsoft.com/en-us/library/dn589792.aspx 本文介绍了一种有利于物化(materialize)领 ...
- Android开发中多进程共享数据
# 背景 最近在工作中遇到一个需求,需要在接收到推送的时候将推送获得的数据存起来,以供app启动时使用.我们会认为这不是So easy吗?只要把数据存到SharedPreferences中,然后让ap ...
- N++ 道ASP.NET面试题
InterviewQuestions-ASP.NET N++ 道ASP.NET面试题 1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . ...