对含有字母和数字的列排序(replace函数和translate函数用法)


需求:字段混合了字母和数字的数据,希望按照字母部分或者数字部分进行来排序。


如元数据为:

对含有字母和数字的列排序(replace函数和translate函数用法)_第1张图片

需要按照该字段后面的数字进行排序。

那么,余光一扫,就会想到最简单的方法就是按照该字段的长度进行截取字符串,然后在排序,如:

SELECT DATA_INFO,substr(DATA_INFO,length(DATA_INFO)-1,2)AS SORTED 
  FROM DATATEST 
 ORDER BY 2;

这里的 ORDER BY 2,就是 SELECT 的第二个字段 SORTED ,等价于 ORDER BY SORTED ;
对含有字母和数字的列排序(replace函数和translate函数用法)_第2张图片

就这么简单?怎么突出极客精神?抱着学习的态度,可以使用一下 replace,translate 函数来玩儿一下:


** replace 用法:

replace(char, search_string,replacement_string)

将字符串 char 按照 被替换掉的字符串 search_string 中全部对应替换为 replacement_string。
不扯了,上例子:

select replace(‘fgsgswgosgsfk’, ‘gs’,‘j’) from dual;
对含有字母和数字的列排序(replace函数和translate函数用法)_第3张图片
结果为:fjjwgosjfk


** translate用法:

translate(expr, from_strimg, to_string)

按照字符串 expr中的 from_strimg 一一对应进行替换,若没有,则该字符串删除。

eg:

select translate(‘abcdefga’, ‘abc’,‘wo’) from dual;
对含有字母和数字的列排序(replace函数和translate函数用法)_第4张图片
结果为:wodefgw

注意:replace 函数和 translate 函数 MySQL 和 SQL Server 支持 translate 函数。


解决方式2:


则按照刚开始的需求,使用这两个函数,则SQL如下:

select * 
  from DATATEST
 order by replace(DATA_INFO,
                 replace(
                 translate(DATA_INFO, '0123456789','##########')
                 ,'#' ,'')
                 ,'')

对含有字母和数字的列排序(replace函数和translate函数用法)_第5张图片
没看懂,没关系,分步骤来。

① 将数字化为 # :

select translate(DATA_INFO, ‘0123456789’,’##########’) from DATATEST;
对含有字母和数字的列排序(replace函数和translate函数用法)_第6张图片
② 将 # 化为 无形,只显示字母:

select replace(translate(DATA_INFO, ‘0123456789’,’##########’),’#’,’’) from DATATEST;
对含有字母和数字的列排序(replace函数和translate函数用法)_第7张图片
③ 将字母替换为无形:

select replace(DATA_INFO,
      replace(translate(DATA_INFO, ‘0123456789’,’##########’),’#’,’’),’’)
  from DATATEST;
对含有字母和数字的列排序(replace函数和translate函数用法)_第8张图片
③ 按照数字进行排序。

注意:replace 函数和 translate 函数 MySQL 和 SQL Server 支持 translate 函数。

全篇到此结束。

你可能感兴趣的:(SQL,数据库,sql)