当前位置:首页 > 问答 > 正文

MSSQL里怎么快速去掉多余空格然后顺序排好数据,简单实用方法分享

(来源:博客园 - SQL Server中去除空格的实战技巧)

在MSSQL里处理数据,经常会遇到字段内容前后或者中间有多余空格的情况,这些空格可能是用户输入时不小心带上的,或者从其他系统导入数据时产生的,它们会让数据看起来不整齐,更麻烦的是,在做数据比对、查询或者报表生成时,这些多余的空格很可能导致结果出错,你明明觉得两个值是一样的,但就是因为一个后面多了个空格,SQL就把它们当成不同的数据了,学会快速清理这些空格,把数据排得整整齐齐,是日常工作中一个很实用的技能。

(来源:CSDN - T-SQL字符串函数使用大全)

MSSQL提供了一些内置的字符串函数,专门用来对付空格问题,最常用的几个是LTRIM、RTRIM和TRIM,LTRIM这个函数的作用很简单,就是去掉字符串开头(左边)的所有空格,你有一个字段里的值是“ Hello”,用了LTRIM之后,就变成“Hello”了,开头的空格全没了,RTRIM正好相反,它是去掉字符串末尾(右边)的空格,像“World ”这样的值,经过RTRIM处理,就变成了“World”,那如果字符串两头都有空格怎么办?在早期版本的SQL Server(比如2016以前)里,没有直接的TRIM函数,你得把LTRIM和RTRIM组合起来用,写成LTRIM(RTRIM(字段名)),这样就能把两头的空格都去掉了,这个方法虽然多写几个字母,但效果很好,很多人用了很多年。

(来源:Microsoft官方文档 - TRIM函数)

如果你用的SQL Server是2017版本或者更新的版本,那就方便多了,因为微软直接给了TRIM这个函数,TRIM函数更强大,它默认就会把字符串开头和结尾的空格都去掉,你只需要写TRIM(字段名)就可以了,比写LTRIM(RTRIM(字段名))省事多了,TRIM函数还有个好处是,它不仅能去掉空格,你还可以指定去掉其他字符,比如制表符或者换行符,不过在日常处理空格的需求里,直接用TRIM()最简单。

(来源:个人实践总结及技术社区讨论)

上面说的都是处理字符串两头的空格,那如果空格出现在字符串中间呢?Hello World”这种,单词中间有多个空格,你想把它变成一个空格,该怎么办?这时候LTRIM、RTRIM或者TRIM就没办法了,因为它们只管两头,不管中间,对于这种情况,需要一个稍微复杂点的方法,我们可以用REPLACE函数先把字符串里所有连续的空格都替换成一个特定的、平时不会用到的字符(比如一个很特殊的符号,或者一组像<><>这样的字符),目的是先做个标记,然后再用REPLACE函数,把这个标记字符换回成一个单独的空格,但是这个方法有点绕,而且万一你选的标记字符本身就在数据里存在,就可能把数据弄乱。

一个更稳妥、更常用的方法是结合使用REPLACE函数和递归或循环的逻辑(比如用CTE公共表表达式),但那个对新手来说有点复杂,有一个相对简单实用的变通方法是:如果你能确定中间的空格最多连续出现几次,可以嵌套使用REPLACE,你先用REPLACE把两个连续空格换成一个空格,执行一次后,可能还有四个空格变成的两个空格没处理完,那就再执行一次同样的替换,直到所有连续空格都变成一个为止,但这不是一个一劳永逸的办法,因为如果空格数量不确定,你可能需要执行很多次,在MSSQL 2017及以上版本,可以尝试结合STRING_SPLIT和STRING_AGG(2017版开始支持)来重新组装字符串,但这属于进阶用法。

(来源:Stack Overflow高赞回答关于数据排序整理)

把空格去掉之后,下一步就是让数据按顺序排好了,排序就用到我们最熟悉的ORDER BY子句,这里有个小细节要注意:我们会在ORDER BY子句里直接使用已经去掉空格的列,或者使用处理过的列表达式,你可以写 SELECT TRIM(FirstName) AS CleanName FROM YourTable ORDER BY CleanName,这样排序的依据就是清理干净后的数据,能确保排序结果是真正按照内容的字母顺序来的,不会被多余的空格干扰,如果你在WHERE条件里也要用这个清理过的值来过滤,为了性能考虑,有时候会建议在查询中先对数据进行预处理(比如放在一个子查询或者CTE里),避免在WHERE和ORDER BY里重复计算TRIM函数。

(来源:数据库优化实践笔记)

简单提一下性能,如果某个字段经常需要做去空格和排序的操作,而表的数据量又非常大,每次都现场用TRIM函数可能会有点慢,因为函数计算是会消耗资源的,一个治本的办法是,如果业务允许,可以在设计表的时候,就对这个字段的数据输入进行约束,比如在前端程序或者插入数据的存储过程里就做好空格清理,让存进数据库的数据本身就是干净的,或者,可以考虑在该字段上建立一个持久化计算列(Persisted Computed Column),这个列的值就是TRIM(原字段)的结果,然后在这个计算列上建立索引,这样,当你需要按清理后的数据排序或查询时,数据库可以直接利用索引,速度会快非常多,不过这属于稍微高级一点的优化技巧了,需要根据实际情况来决定是否使用。

在MSSQL里快速整理数据,核心就是灵活运用LTRIM、RTRIM、TRIM这几个函数来处理空格,再用ORDER BY来排序,对于中间的空格,REPLACE函数是主要的工具,但需要根据情况选择合适的使用策略,先从简单的需求练起,熟练之后再慢慢研究更复杂的情况和优化方法。

MSSQL里怎么快速去掉多余空格然后顺序排好数据,简单实用方法分享