Oracle中中文、数字,英文混杂形式的字段进行排序的方法

http://blog.csdn.net/p451933505/article/details/9272257

对Oracle中中文、数字、英文混杂形式的字段进行排序的方法:

例如:

  1. order by NLSSORT(字段名,‘NLS_SORT = SCHINESE_PINYIN_M‘), to_number(translate(字段名, ‘0123456789‘ || 字段名, ‘0123456789‘))

NLSSORT() 函数:

可以使用NLSSORT()函数可以改变Oralce 对汉字的排序规则,排序规则如下(前三条对简体中文进行排序,后两条对繁体中文进行排序):

1. SCHINESE_RADICAL_M

简体中文按照第一顺序是“部首”、第二顺序是“笔画数”进行排序。

2. SCHINESE_STROKE_M

简体中文按照第一顺序“笔画数”、是第二顺序是“部首”进行排序。

3. SCHINESE_PINYIN_M

简体中文按照拼音进行排序。上例中即对简体汉字按照拼音进行排序。

4. TCHINESE_RADICAL_M

繁体中文按照第一顺序是“部首”、第二顺序是“笔画数”进行排序。

5. TCHINESE_STROKE_M

繁体中文按照第一顺序是“笔画数”、第二顺序是“部首”进行排序。

TRANSLATE() 函数:

用法:将char中出现在from中的每个字符替换为to中的相应字符,若from比to字符串长,那么在from中比to中多出的字符将会被删除。三个参数中有一个是空,返回值也将是空值。

  1. select TRANSLATE(‘例1213‘,‘0123456789‘||‘例1213‘,‘0123456789‘) as RESULT from dual;
  2. RESULT
  3. ------------
  4. 1213

分析:该语句要将 char--‘例1213‘ 中出现在 from--‘0123456789例1213‘ 中的字符替换为 to--‘0123456789‘ 中的字符,根据 from、to 的对应关系,将 char 中的 0替换成0、1替换成1、...9替换成9,即 char 中的数字不变,又 from 比 to 长,则 from 中比 to 中多出的字符将被删除,即删除 char 中的汉字。

时间: 2024-10-22 16:34:04

Oracle中中文、数字,英文混杂形式的字段进行排序的方法的相关文章

oracle中对数字加汉字的排序以及REGEXP_SUBSTR介绍

需求:有一列NAME, varchar2类型,内容如下 以上就是已经按order by name进行排序的,但不是我们想要的结果 现在需要只按数字进行排序 第一步:抽取数字由于数字有是一位的有是两位的 所以不好用substr进行截取 我们可以使用REGEXP_SUBSTR函数,使用正则表达式从字符串中抽取子串. REGEXP_SUBSTR(name, '[0-9]+') 第二步.将varchar类型的数字转换为int类型的数字 cast(yourcol as int) 可参考:sql中,把var

oracle中出现"数据被另一用户锁住"的解决方法

在oracle中执行: select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$session t2 where t1.session_id=t2.sid order by t2.logon_time; alter system kill session 'SID,serial#' 版权声明:本文为博主原创文章,未经博主允许不得转载.

oracle中如何更改一个表的一个字段属性(名称,类型)

修改字段的属性,名称方法 --修改某一个字段的类型,当该字段不为null时 ALTER TABLE 表名 ADD  字段 NUMBER(11,0) ; --新创建一列,期待的字段类型 UPDATE 表名 SET 字段_bak= 字段;COMMIT; --复制旧字段值到新字段,dml的都需要提交 ALTER TABLE 表名DROP COLUMN 字段;--删除掉旧字段 ALTER TABLE 表名RENAME COLUMN 字段_bakTO 字段;--修改新字段的名称 alter table 表

charAt()统计字符串中中文,英文,数字

public class StatisticZEN { public static void main(String[] args) { String str = "凛冬lindong12将至jiangzhi21"; statisticsChar(str); } private static HashMap<String, Integer> statisticsChar(String str) { int chineseCount = 0; int englishCount

sql 自定义函数返回中文,数字,英文

--提取数字IF OBJECT_ID('DBO.GET_NUMBER2') IS NOT NULLDROP FUNCTION DBO.GET_NUMBER2GOCREATE FUNCTION DBO.GET_NUMBER2(@S VARCHAR(100))RETURNS VARCHAR(100)ASBEGINWHILE PATINDEX('%[^0-9]%',@S) > 0BEGINset @s=stuff(@s,patindex('%[^0-9]%',@s),1,'')ENDRETURN @S

oracle中中文乱码的问题

1.查看服务器端编码select userenv('language') from dual;我实际查到的结果为:AMERICAN_AMERICA.ZHS16GBK2.执行语句 select * from V$NLS_PARAMETERS 查看第一行中PARAMETER项中为NLS_LANGUAGE 对应的VALUE项中是否和第一步得到的值一样.如果不是,需要设置环境变量.否则PLSQL客户端使用的编码和服务器端编码不一致,插入中文时就会出现乱码.3.设置环境变量计算机->属性->高级系统设置

ORACLE-012:oracle中纯数字的varchar2类型和number类型自动转换

使用过一个关联查询,两个表的字段定义了不同的类型.一个字段是varchar2类型,另一个字段是number类型,内容如下:'00187'和187.在使用中发现会自动将varchar2类型转换为number,即187和187. 效果与to_number()一样. 专门写了两个sql测试了下,如下: select case when '0110' = 110 then 'true' else 'false' end from dual; select case when to_number('011

Oracle中,将毫秒数转换为timestamp类型的两种方法

在许多场景中,开发人员习惯用1970-01-01 00:00:00.000以来的毫秒数来表示具体的时间,这样可以将数据以NUMBER类型存储到数据库中,在某些时候方便比较,同样,有些时候我们需要 把这种毫秒数转换成标准的TIMESTAMP类型,现在总结了两种实现方法: 方法一: SELECT TO_TIMESTAMP('1970-01-01 00:00:00.000','yyyy-MM-dd hh24:mi:ss.ff3')+1397457489296/1000/60/60/24 FROM du

Oracle中查看表是否被锁和如何解锁的处理方法

--1.以下几个为相关表SELECT * FROM v$lock;SELECT * FROM v$sqlarea;SELECT * FROM v$session;SELECT * FROM v$process ;SELECT * FROM v$locked_object;SELECT * FROM all_objects;SELECT * FROM v$session_wait; --2.查看被锁的表 select b.owner,b.object_name,a.session_id,a.loc