# 第109章 SQL函数 POSITION 返回子字符串在字符串中的位置的字符串函数。 # 大纲 ```java POSITION(substring IN string) ``` # 参数 - `substring` - 要搜索的子字符串。 它可以是列的名称、字符串字面值或另一个标量函数的结果,其中基础数据类型可以表示为任何字符类型(如`CHAR`或`VARCHAR2`)。 - `IN string` - 要在其中搜索子字符串的字符串表达式。 `POSITION`返回`INTEGER`数据类型。 # 描述 `POSITION`返回字符串中子字符串的第一个位置。 位置以整数形式返回。 如果`substring`没有找到,则返回`0(0)`。 如果传递给任何一个参数一个`NULL`值,`POSITION`将返回`NULL`。 位置是区分大小写的。 使用其中一个大小写转换函数来定位字母或字符串的大写和小写实例。 # POSITION, INSTR, CHARINDEX和$FIND `POSITION`、`INSTR`、`CHARINDEX`和`$FIND`都将搜索字符串中指定的子字符串,并返回与第一个匹配项对应的整数位置。 `CHARINDEX`、`POSITION`和`INSTR`返回匹配子字符串的第一个字符的整数位置。 `$FIND`返回匹配子字符串结束后第一个字符的整数位置。 `CHARINDEX`、`$FIND`和`INSTR`支持指定子字符串搜索的起始点。 `INSTR`还支持从起始点指定子字符串出现。 下面的示例演示了这四个函数,指定了所有可选参数。 注意,在这些函数中,`string`和`substring`的位置不同: ```sql SELECT POSITION('br' IN 'The broken brown briefcase') AS Position, CHARINDEX('br','The broken brown briefcase',6) AS Charindex, $FIND('The broken brown briefcase','br',6) AS Find, INSTR('The broken brown briefcase','br',6,2) AS Inst 5 12 14 18 ``` # 示例 下面的例子返回`11`,因为`“b”`是字符串中的第`11`个字符: ```sql SELECT POSITION('b' IN 'The quick brown fox') AS PosInt 11 ``` 下面的示例返回示例中每个名字的姓氏长度。 人表。 它定位用于将姓氏与`name`字段的其余部分分隔开的逗号,然后从该位置减去`1`: ```sql SELECT Name, POSITION(',' IN Name)-1 AS LNameLen FROM Sample.Person ``` 下面的示例返回样本中每个名称中字母`“B”`的第一个实例的位置。 人表。 因为`POSITION`是区分大小写的,所以在执行搜索之前使用`%SQLUPPER`函数将所有的名称值转换为大写。 因为`%SQLUPPER`在字符串的开头添加了一个空格,所以这个示例减去1以获得实际的字母位置。 没有找到指定字符串的搜索将返回`0` (0); 在本例中,由于减法为`1`,这些搜索显示的值为`-1`: ```sql SELECT Name, POSITION('B' IN %SQLUPPER(Name))-1 AS BPos FROM Sample.Person ```