本篇文章为大家展示了SQL 中怎么拆分字符串中的数值后排序,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
通常情形下,一列数据都是整体参与排序,但如果当字段是由字母跟序号组合在一起的复合列,比如现有表TData中列名为NameSerial的一组数据:
Mike105
Rose11
Rose1
Rose5
Mike6
现在需要先按名字排序,再按序号排序。比如Mike6要排在Mike105前面,期望的结果如下:
Mike6
Mike105
Rose1
Rose5
Rose11
由于SQL不支持对字段的单词拆分,所以只能写存储过程拆分数据,然后使用SQL查询来排序。以SQL Server2012为例,自定义数据拆分标量值函数dbo.words如下:
CREATE FUNCTION dbo.words(@word VARCHAR(100) , @part INT) RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @sub VARCHAR(100)
DECLARE @tmp VARCHAR(10)
DECLARE @numIndex INT
DECLARE @len INT
DECLARE @i INT
SET @i = 1
SET @len = Len(@word)
WHILE @i<=@len
BEGIN
SET @tmp = Substring(@word,@i,1)
IF(ISNUMERIC(@tmp)=1)
BEGIN
SET @numIndex = @i
BREAK
END
SET @i=@i+1
END
IF(@part=1)
BEGIN
SET @sub=Substring(@word,1,@numIndex-1)
END
ELSE
BEGIN
SET @sub=Substring(@word,@numIndex,@len-@numIndex+1)
END
RETURN @sub
END
其中参数@part用于指示当前要拆分的部分,1为名字部分,2为序号部分。
需要注意的是,数值部分拆分出来后,要转换为整数后再排序,否则仍然跟整体排序没区别。之后的排序,只需要如下SQL即可:
SELECT * FROM TData ORDER BY dbo.words(NameSerial,1),cast(dbo.words(NameSerial,2) as int)
本例虽然通过自定义数据库函数的方式实现了拆分函数,但并不通用,且不能移植到其他数据库。
这种情况,如果有集算器就方便多了,用SPL实现只要一句话:
connect("db").query("SELECT * FROM TData").sort(NameSerial.words@w())
上述内容就是SQL 中怎么拆分字符串中的数值后排序,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注天达云行业资讯频道。