CHARINDEX (Transact-SQL)

在 expression2 中搜索 expression1 并返回其起始位置(如果找到)。搜索的起始位置为 start_location。

主题链接图标Transact-SQL 语法约定

语法

CHARINDEX ( expression1 ,expression2 [ , start_location ] ) 

参数

  • expression1
    包含要查找的序列的字符表达式。expression1 最大长度限制为 8000 个字符。

  • expression2
    要搜索的字符表达式。

  • start_location
    表示搜索起始位置的整数或 bigint 表达式。如果未指定 start_location,或者它为负数或 0,则将从 expression2 的开头开始搜索。

返回类型

如果 expression2 的数据类型为 varchar(max)、nvarchar(max) 或 varbinary(max),则为 bigint,否则为 int。

注释

如果 expression1 或 expression2 之一是 Unicode 数据类型(nvarchar 或 nchar)而另一个不是,则将另一个转换为 Unicode 数据类型。CHARINDEX 不能与 image 数据类型一起使用。

如果 expression1 或 expression2 之一为 NULL,并且数据库兼容级别为 70 或更高,则 CHARINDEX 将返回 NULL。如果数据库兼容级别为 65 或更低,则 CHARINDEX 将仅在 expression1 和 expression2 都为 NULL 时才返回 NULL 值。

如果在 expression2 内找不到 expression1,则 CHARINDEX 返回 0。

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

返回的开始位置从 1 开始,而非从 0 开始。

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

示例

以下示例返回字符序列 bicycle 在 Document 表的 DocumentSummary 列中开始的位置。

DECLARE @document varchar(64)

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

下面是结果集:

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

以下示例将使用可选的 start_location 参数从 DocumentSummary 列的第五个字符开始查找 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)

以下示例显示了在 expression2 内找不到 expression1 时的结果集。

DECLARE @document varchar(64)

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

下面是结果集:

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

(1 row(s) affected)

下面的示例在 'Das jst ein Test' 中执行区分大小写的字符串 'TEST' 搜索。

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

下面是结果集:

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

下面的示例在 'Das jst ein Test' 中执行区分大小写的字符串 'Test' 搜索。

USE tempdb;
GO
SELECT CHARINDEX ( 'Test',
       'Das ist ein Test'
       COLLATE Latin1_General_CS_AS)

下面是结果集:

----------- 
13          

下面的示例在 'Das jst ein Test' 中执行不区分大小写的字符串 'TEST' 搜索。

USE tempdb;
GO
SELECT CHARINDEX ( 'Test',
       'Das ist ein Test'
       COLLATE Latin1_General_CI_AS)
GO

下面是结果集:

----------- 
13