CHARINDEX (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库

此函数会在第二个字符表达式中搜索一个字符表达式,这将返回第一个表达式(如果发现存在)的开始位置。

Transact-SQL 语法约定

语法

CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )   

注意

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

参数

expressionToFind
一个字符表达式,其中包含要查找的序列。 expressionToFind 限制为 8000 个字符 。

expressionToSearch
要搜索的字符表达式。

start_location
表示搜索开始位置的 integer 或 bigint 表达式 。 如果 start_location 未指定、具有负数值或 0,搜索将从 expressionToSearch 的开头开始 。

返回类型

如果 expressionToSearch 具有一个 nvarchar(max)、varbinary(max) 或 varchar(max) 数据类型,则为 bigint;否则为 int 。

备注

如果 expressionToFind 或 expressionToSearch 表达式具有一个 Unicode 数据类型(nchar 或 nvarchar),而其他的表达式不具有,CHARINDEX 函数则会将其他表达式转换为一个 Unicode 数据类型 。 CHARINDEX 不能与 image、ntext 和 text 数据类型一起使用 。

如果 expressionToFind 或 expressionToSearch 表达式具有 NULL 值,CHARINDEX 则返回 NULL 。

如果 CHARINDEX 在 expressionToSearch 中找不到 expressionToFind,CHARINDEX 则返回 0 。

CHARINDEX 根据输入排序规则执行比较操作。 若要以指定的排序规则执行比较,可以使用 COLLATE 将显式排序规则应用于输入。

返回的起始位置从 1 开始,而不是从 0 开始。

0x0000 (char(0)) 是 Windows 排序规则中未定义的字符,不能包括在 CHARINDEX 中 。

补充字符(代理项对)

在使用 SC 排序规则时,start_location 和返回值将代理项对计为一个字符,而不是计为两个字符 。 有关详细信息,请参阅 排序规则和 Unicode 支持

示例

A. 返回表达式的起始位置

此示例将在搜索的字符串值变量 @document 中搜索 bicycle

DECLARE @document VARCHAR(64);  
SELECT @document = 'Reflectors are vital safety' +  
                   ' components of your bicycle.';  
SELECT CHARINDEX('bicycle', @document);  
GO  

下面是结果集:

-----------   
48            

B. 从特定位置中搜索

此示例使用可选的 start_location 参数在搜索的字符串值变量 @document 的第五个字符处开始搜索 vital

DECLARE @document VARCHAR(64);  
  
SELECT @document = 'Reflectors are vital safety' +  
                   ' components of your bicycle.';  
SELECT CHARINDEX('vital', @document, 5);  
GO  

下面是结果集。

-----------   
16            
  
(1 row(s) affected)  

C. 搜索不存在的表达式

此示例显示 CHARINDEX 在 expressionToSearch 中找不到 expressionToFind 时的结果集 。

DECLARE @document VARCHAR(64);  
  
SELECT @document = 'Reflectors are vital safety' +  
                   ' components of your bicycle.';  
SELECT CHARINDEX('bike', @document);  
GO  

下面是结果集。

-----------
0
  
(1 row(s) affected)

此示例在搜索的字符串 'This is a Test``' 中执行区分大小写的字符串 'TEST' 搜索。

USE tempdb;  
GO  
--perform a case sensitive search  
SELECT CHARINDEX ( 'TEST',  
       'This is a Test'  
       COLLATE Latin1_General_CS_AS);  

下面是结果集。

-----------
0

此示例在 'This is a Test' 中执行区分大小写的字符串 'Test' 搜索。

  
USE tempdb;  
GO  
SELECT CHARINDEX ( 'Test',  
       'This is a Test'  
       COLLATE Latin1_General_CS_AS);  

下面是结果集。

-----------
11

此示例在 'This is a Test' 中执行不区分大小写的字符串 'TEST' 搜索。

USE tempdb;  
GO  
SELECT CHARINDEX ( 'TEST',  
       'This is a Test'  
       COLLATE Latin1_General_CI_AS);  
GO  

下面是结果集。

-----------
11

示例:Azure Synapse Analytics 和 Analytics Platform System (PDW)

F. 从字符串表达式的开头搜索

此示例返回字符串 This is a string 中字符串 is 的第一个位置,从 This is a string 的位置 1(第一个字符)开始。

SELECT CHARINDEX('is', 'This is a string');  

下面是结果集。

---------
3

G. 从第一个位置以外的位置搜索

此示例返回字符串 This is a string 中字符串 is 的第一个位置,从位置 4(第四个字符)开始进行搜索。

SELECT CHARINDEX('is', 'This is a string', 4);  

下面是结果集。

---------
 6

H. 未找到字符串时的结果

此示例显示 CHARINDEX 在搜索的字符串中找不到字符串 string_pattern 时的返回值 。

SELECT TOP(1) CHARINDEX('at', 'This is a string') FROM dbo.DimCustomer;  

下面是结果集。

---------
0

另请参阅

LEN (Transact-SQL)
PATINDEX (Transact-SQL)
字符串函数 (Transact-SQL)
+(字符串串联)(Transact-SQL)
排序规则和 Unicode 支持