# 第149章 SQL函数 TRIM 字符串函数,它返回删除了指定的前导和/或尾随字符的字符串。 # 大纲 ```java TRIM([end_keyword] [characters FROM] string-expression) ``` # 参数 - `end_keyword` - 可选 — 一个关键字,指定要剥离的字符串表达式的哪一端。可用值为 `LEADING`、`TRAILING` 或 `BOTH`。默认为两者。 - `characters` - 可选 — 一个字符串表达式,指定要从字符串表达式中删除的字符。指定字符的每个实例都从指定的末端被剥离,直到遇到此处未指定的字符。因此`TRIM(BOTH 'ab' FROM 'bbbaacaaa')` 返回 `‘c’`。在此示例中,`BOTH` 关键字是可选的。如果未指定字符,`TRIM` 会去除空格。如果指定了字符,则需要 `FROM` 关键字。如果指定了 `end_keyword` 而未指定字符,则允许使用 `FROM` 关键字(但不是必需的)。如果没有指定这些参数,则不允许使用 `FROM` 关键字。 - `string-expression` - 要剥离的字符串表达式。字符串表达式可以是列名、字符串文字或另一个函数的结果,其中基础数据类型可以表示为任何字符类型(例如 `CHAR` 或 `VARCHAR2`)。如果省略了字符和 `end_keyword`,则省略 `FROM` 关键字。 # 描述 `TRIM` 从提供的值的开头和/或结尾去除指定的字符。默认情况下,去除字母是区分大小写的。当遇到未在字符中指定的字符时,从任一端停止字符剥离。默认是从字符串表达式的两端去除空格。 无论要修剪的输入表达式的数据类型如何,`TRIM` 始终返回数据类型 `VARCHAR`。 请注意,在将数字提供给 `TRIM` 或任何其他 `SQL` 函数之前,它们会自动从数字中去除前导零。要保留前导零,必须将数字指定为字符串。 可选的 `end_keyword` 参数可以采用以下值: - `LEADING` - 关键字,指定要从 `string-expression` 的开头删除 characters 中的字符。 - `TRAILING` - 关键字,指定要从 `string-expression` 的末尾删除 characters 中的字符。 - `BOTH` - 关键字,指定要从 `string-expression` 的开头和结尾删除 `characters` 中的字符。 `BOTH` 是默认值,如果未指定 `end_keyword` 则使用。 或者,可以使用 `LTRIM` 修剪前导空白,或使用 `RTRIM` 修剪尾随空白。 要使用前导或尾随空格或其他字符填充字符串,请使用 `LPAD` 或 `RPAD`。 可以使用 `LENGTH` 函数来确定是否已从字符串中删除或添加空格。 # 要剥离的字符 - 所有字符:如果字符包含 `string-expression` 中的所有字符,则 `TRIM` 返回一个空字符串。 - 单引号字符:如果单引号字符在字符和字符串表达式中都是双引号,则`Trim`可以删减这些字符。因此,`TRIM(BOTH 'a''b' FROM 'bb''ba''acaaa''')`返回`’c‘`。 - 空格:如果省略字符,`TRIM` 会从字符串表达式中修剪空格。如果指定了字符,则必须包含空格字符以去除空格。 - `%List`:如果 `string-expression` 是 `%List`,`TRIM` 只能修剪尾随字符,不能修剪前导字符。这是因为 `%List` 包含前导编码字符。必须将 `%List` 转换为字符串才能将 `TRIM` 应用于前导字符。 - `NULL`:如果任一字符串表达式为 `NULL`,`TRIM` 将返回 `NULL`。 # 示例 以下示例使用 `end_keyword` 和 `characters` 默认值;它从`“abc”`中删除前导和尾随空格。选择项将`“^”`连接到字符串的两端以显示空白。 ```sql SELECT '^'||' abc '||'^' AS UnTrimmed,'^'||TRIM(' abc ')||'^' AS Trimmed ^ abc ^ ^abc^ ``` 以下示例都是从字符串表达式中去除前导空格的有效语法: ```sql SELECT TRIM(LEADING ' abc '),TRIM(LEADING FROM ' def '),TRIM(LEADING ' ' FROM ' ghi ') abc def ghi ``` 以下示例从字符串`“xxxabcxxx”`的开头删除字符`“x”`,得到`“abcxxx”`: ```sql SELECT TRIM(LEADING 'x' FROM 'xxxabcxxx') AS Trimmed abcxxx ``` 以下示例均删除了`“xxxabcxxx”`开头和结尾的字符`“x”`,结果为`“abc”`。第一个指定 `BOTH`,第二个将 `BOTH` 作为默认值: ```sql SELECT TRIM(BOTH 'x' FROM 'xxxabcxxx') AS Trimmed abc ``` ```sql SELECT TRIM('x' FROM 'xxxabcxxx') AS Trimmed abc ``` 以下示例从`“abcxzzxyyyyz”`的末尾删除字符`“xyz”`的所有实例,从而产生`“abc”`: ```sql SELECT TRIM(TRAILING 'xyz' FROM 'abcxzzxyyyyz') AS Trimmed. abc ``` 下面的示例去掉`FirstName`中的所有字母,返回前面有空格的姓氏,从而修剪`FullName`。例如`FirstName/Fullname‘fred’/‘fred Rogers’`返回`‘Rogers’`。在本例中,`FirstName‘Annie’`将从`LastName`中去掉`‘Ann’`、`‘Anne’`、`‘Ani’`、`‘Ain’`、`‘Annee’`或`‘Annie’`,但不会完全去掉`‘Anna’`,因为`Trim`区分大小写;只会去掉`‘A’`,而不是`‘a’`。 ```sql SELECT TRIM(LEADING FirstName FROM FullName) FROM Sample.Person ``` 以下示例从`FavoriteColors`值中删除前导字母`"B"`或`"R"`。请注意,必须将列表转换为字符串,才能对前导字符应用剪裁: ```sql SELECT TOP 15 Name,FavoriteColors, TRIM(LEADING 'BR' FROM $LISTTOSTRING(FavoriteColors)) AS Trimmed FROM Sample.Person WHERE FavoriteColors IS NOT NULL ```