某小区,需要按照小区,楼栋,单元号,房间号进行排序,但是按照地址描述排序时,因为字符串中包含数字,所以造成了如下的结果,
1号楼之后应该是2号楼,但是查询结果却是10号楼。
尝试解决
使用正则表达式替换
结果:
虽然楼栋号排序正常了,但是会发现房间号排序出现了混乱又是;继续想办法
终极办法:
使用翻译函数
可以发现,结果正常显示。
<强>一、语法:强>
<代码>翻译(字符串、from_str to_str) 代码>
<强>二、目的强>
返回将(所有出现的)from_str中的每个字符替换为to_str中的相应字符以后的string.TRANSLATE是替换所提供的功能的一个超集。如果from_str比to_str长,那么在from_str中而不在to_str中的额外字符将从字符串中被删除,因为它们没有相应的替换字符.to_str不能为空.Oracle将空字符串解释为NULL,并且如果中翻译的任何参数为零,那么结果也是NULL。
<强>三,允许使用的位置强>
过程性语句和SQL语句。
<强>四,示例强>
Sql代码
选择翻译(‘abcdefghij’,‘六边形abcdef’,‘123456’)双; 翻译( -------------- 123456 ghij 选择翻译(‘abcdefghij’,‘abcdefghij’,‘123456’)双; TRANSL ---------- 123456年
语法:TR <代码> ANSLATE(从,expr) 代码>
expr:代表一串字符,从与是从左到右一一对应的关系,如果不能对应,则视为空值。
举例:
选择翻译(“abcbbaadef”、“ba”、“# @”)从双(b将被#替代,一个将被@替代) 选择翻译(“abcbbaadef”,“坏”,“# @”)从双(b将被#替代,一个将被@替代,d对应的值是空值,将被移走)
因此:结果依次为:@ # c # # @@def c和@ # # # @@ef
语法:<代码>翻译(从,expr) 代码>
expr:代表一串字符,从与是从左到右一一对应的关系,如果不能对应,则视为空值。
举例:
选择翻译(“abcbbaadef”、“ba”、“# @”)从双(b将被#替代,一个将被@替代) 选择翻译(“abcbbaadef”,“坏”,“# @”)从双(b将被#替代,一个将被@替代,d对应的值是空值,将被移走)
因此:结果依次为:@ # c # # @@def c和@ # # # @@ef
示例如下:
,示例一:将数字转换为9,其他的大写字母转换为X,然后返回。
选择翻译(‘2 krw229’,‘0123456789 abcdefghijklmnopqrstuvwxyz’,‘9999999999 xxxxxxxxxxxxxxxxxxxxxxxxxx’)“许可证”双重
示例二:将数字保留,将其他的大写字母移除。
选择翻译(‘2 krw229’,‘0123456789 abcdefghijklmnopqrstuvwxyz’,‘0123456789’)“翻译例子”双重
罗勇补充示例如下:
示例三:示例证明是按照字符来处理,不是按照字节来处理,如果to_string的字符数比from_string多的话,多出的字符数似乎没有什么用处,也不会引发异常。
选择翻译(“我是中国人,我爱中国”,“中国”,“中国”)“翻译例子” 从双
示例四:下面的示例证明,如果from_string的字符数大于to_string,那么多出的字符会被移除,也就是在三个字符会从char参数中移除,当然区分大小写啦。
选择翻译(“我是中国人,我爱中国”、“中国”、“中国”)“翻译例子” 从双
示例五:以下示例证明,如果第二个参数为空字符串,整个返回零。
选择翻译(“2 krw229”, “0123456789 abcdefghijklmnopqrstuvwxyz”, ”)“许可证” 从双
示例六:在银行转帐时经常看见账户人只显示姓名的最后一个字,其余的用星号代替,我就用翻译来做个类似的东西吧。