SQL自定义Trim函数,删除左右字符

本文介绍了一种在SQL中自定义Trim函数的方法,该函数能够有效地去除字符串前后的指定字符及空白字符,提供了完整的实现代码及测试案例。

程序中的Trim函数大伙都知道的,但是要SQL中只有LTRIM,RTRIM删除左、右空白字符,而不能删除指定字符,所以我们自己写一个。

要求:

1. 能删除前后空白,如 '   aa ' -> 'aa'

2. 能删除前后字符,并不受空白影响,如 '  ;aa'  -> 'aa'

3. 删除前后字符后,需清除前后空格,如 ';   aa' ->  'aa'

4. 需删除前后连续的字符,如 ';;;aa'  ->  'aa'

网上也有一些别人写的,我觉得很不错,不过貌似没有完整的能达到要求的,所以自己动手写了一个。

创建函数代码如下:

/****** 
Object:  UserDefinedFunction [dbo].[TRIM]    
Script Date: 11/18/2011 09:10:14 
Author: EF
******/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[trim]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[trim]
GO
CREATE FUNCTION dbo.trim
(
    @Source VARCHAR(MAX),
    @Char CHAR(1)
)
RETURNS VARCHAR(MAX)
AS
BEGIN
    DECLARE @i int;
    DECLARE @returnString VARCHAR(MAX)
    SET @returnString = @Source
    --清除前后空格
    SET @returnString = LTRIM(RTRIM(@returnString))
    --删除左侧字符
    SET @i = 0
    WHILE @i=0
    BEGIN
        IF LEFT(@returnString,1) = @Char
        SET @returnString = RIGHT(@returnString,LEN(@returnString)-1)
        ELSE
        SET @i=1
    END
    --删除右侧字符
    SET @i = 0
    WHILE @i=0
    BEGIN
        IF RIGHT(@returnString,1) = @Char
        SET @returnString = LEFT(@returnString,LEN(@returnString)-1)
        ELSE
        SET @i=1
    END
    --清除前后空格
    SET @returnString = LTRIM(RTRIM(@returnString))
    RETURN @returnString;
END

GO

--测试

select dbo.trim('asdfas;asdfasdfa;',';')
union all select dbo.trim(';asdfas;asdfasdfa;',';')
union all select dbo.trim('  ;asdfas;asdfasdfa;',';')
union all select dbo.trim('; asdfas;asdfasdfa;',';')

 

--结果

-------------------------------------------------------------------------

asdfas;asdfasdfa
asdfas;asdfasdfa
asdfas;asdfasdfa
asdfas;asdfasdfa

(4 行受影响)
<think>嗯,用户想了解SQLTRIM函数的使用方法和功能介绍。从用户提供的引用资料来看,ta应该需要一份简明但全面的说明,最好包含实际应用示例。 用户可能正在处理数据库清洗工作,或者在学习SQL字符函数。引用中提到不同数据库的差异,特别是引用3提到Oracle TRIM的扩展功能,引用5展示了高级用法,这些都需要重点说明。 考虑到用户引用了5个不同来源,ta可能已经查阅过资料但仍存在困惑。需要帮ta梳理几个关键点:基础语法(标准/数据库差异)、核心功能(空白/指定字符)、进阶用法(leading/trailing)、与ltrim/rtrim的关系。 特别要注意引用2和4强调的SQL Server 2017新特性,以及引用5那个有趣的"abcxzzxyyyyz"例子,这些能体现TRIM的灵活性。用户可能对删除任意指定字符的功能最感兴趣——毕竟引用3专门提到这是"不谓不牛"的特性。 需要明确区分标准和实现:比如MySQL支持trim/ltrim/rtrim,但SQL Server 2017前只有ltrim/rtrim。示例要覆盖基础空格处理和高级字符删除两类场景,那个从字符串末尾删除xyz序列的例子确实很直观。 最后考虑设计相关问题:用户既然研究trim,可能接着会问字符集处理(如emoji)、性能影响或替代方案。OSX系统登录问题那个关联引用有点突兀,应该忽略。 </think>以下是SQLTRIM函数的详细说明及使用方法,综合了各数据库平台的实现特性: ### 一、核心功能 TRIM函数用于**删除字符串首尾的指定字符**,默认删除空格。语法结构为: ```sql TRIM( [位置] [要删除字符] FROM 目标字符串 ) ``` - **位置参数**(可选): - `LEADING`:仅删除开头字符(等效`LTRIM`) - `TRAILING`:仅删除结尾字符(等效`RTRIM`) - `BOTH`:同时删除首尾(默认值) ### 二、基础用法示例 1. **删除首尾空格**(最常用): ```sql SELECT TRIM(' Hello SQL ') AS Result; -- 返回 'Hello SQL' ``` 2. **指定删除字符**: ```sql SELECT TRIM('x' FROM 'xxSQLxx') AS Result; -- 返回 'SQL'(MySQL/Oracle/SQL Server 2017+) ``` 3. **定向删除**: ```sql --删除开头字符 SELECT TRIM(LEADING '!' FROM '!!!Alert!!!') AS Result; -- 返回 'Alert!!!' --删除结尾字符(引用[5]示例) SELECT TRIM(TRAILING 'xyz' FROM 'abcxzzxyyyyz') AS Result; -- 返回 'abc' ``` ### 三、数据库平台差异 | 数据库 | 支持版本 | 特殊说明 | |---------------|-------------------|------------------------------| | **MySQL** | 全版本 | 支持`TRIM()`、`LTRIM()`、`RTRIM()` | | **SQL Server**| 2017+ | 2017开始支持完整`TRIM()`功能 | | **Oracle** | 全版本 | 支持删除任意指定字符[^3] | | **PostgreSQL**| 8.3+ | 语法与标准兼容 | > ⚠️ 注意:SQL Server 2016及更早版本需用`LTRIM(RTRIM())`组合实现首尾空格删除: > ```sql > SELECT LTRIM(RTRIM(' text ')) AS Result; > ``` ### 四、高级用法 1. **删除非空格字符**(Oracle示例): ```sql -- 删除首尾数字 SELECT TRIM(BOTH '0123456789' FROM '123SQL123') AS Result FROM dual; -- 返回 'SQL' ``` 2. **组合字符处理**: ```sql -- 删除首尾换行符和空格(MySQL) SELECT TRIM(BOTH '\n ' FROM '\n Data\n ') AS Result; -- 返回 'Data' ``` ### 五、应用场景 1. 数据清洗:去除用户输入的首尾无效字符(空格/换行符等) 2. 日志处理:移除固定格式的报文头尾标识符 3. 数据比对:消除空格差异后的精确字符串匹配
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值