在oracle里可以有方法得到汉字的笔画数吗?我现在的目的是要实现按笔画数查找数据库,各位高手支招啊!!
解决方案 »
- 从select的数据全部insert into 到另一个表,表结构有点不同怎么办?
- 真心求教oracle 自定义函数返回值问题
- Oracle的window服务启动时并未启动实例,如何解决呀?
- 关于触发器的编写?
- 创建oracle8i的表空间出现的问题
- 问题
- 急问触发器问题,在线等待!
- 抢分了 ! 如何通过SQL语句得到类似于Listener.log文件中的信息 , 包括登入用户名, 登入program ,ip , pc机器名 , 登入时间 ,所做的动作(s
- oracle的视图能否实现像sql server的视图一样的左联接或右联接或full
- 为什么我进不了SQL*PLUS???
- Routine (test_proc) can not be resolved
- 急求触发器的问题解答。。。
select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_STROKE_M');
//按照部首排序
select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_RADICAL_M');
//按照拼音排序,此为系统的默认排序方式
select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_PINYIN_M');
select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_STROKE_M');
//按照部首排序
select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_RADICAL_M');
//按照拼音排序,此为系统的默认排序方式
select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_PINYIN_M');
不过前期过程痛苦哈哈
如何修改系统默认规则:
alter session set nls_sort='schinese_pinyin_m';
select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_PINYIN_M');Oracle9i之前,中文是按照二进制编码进行排序的。
在oracle9i中新增了按照拼音、部首、笔画排序功能。设置NLS_SORT值
SCHINESE_RADICAL_M 按照部首(第一顺序)、笔划(第二顺序)排序
SCHINESE_STROKE_M 按照笔划(第一顺序)、部首(第二顺序)排序
SCHINESE_PINYIN_M 按照拼音排序,系统的默认排序方式为拼音排序举例如下:
表名为 dept ,其中name字段是中文,下面分别实现按照单位名称的笔划、部首和拼音排序。
1: //按照笔划排序
2: select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_STROKE_M');
3: //按照部首排序
4: select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_RADICAL_M');
5: //按照拼音排序,此为系统的默认排序方式
6: select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_PINYIN_M'); 注意,该SQL指令并非标准指令,在SQLServer下面的实现方式并不相同。
CREATE TABLE TB_STROKE(WORD VARCHAR2(2),STROKE_COUNT NUMBER(2,0));INSERT INTO TB_STROKE(WORD,STROKE_COUNT)
SELECT '一',1 FROM DUAL
UNION ALL
SELECT '二',2 FROM DUAL
UNION ALL
SELECT '口',3 FROM DUAL
UNION ALL
SELECT '木',4 FROM DUAL
UNION ALL
SELECT '禾',5 FROM DUAL
UNION ALL
SELECT '众',6 FROM DUAL
UNION ALL
SELECT '沐',7 FROM DUAL
UNION ALL
SELECT '和',8 FROM DUAL
UNION ALL
SELECT '骨',9 FROM DUAL
UNION ALL
SELECT '徐',10 FROM DUAL
UNION ALL
SELECT '曹',11 FROM DUAL
UNION ALL
SELECT '彭',12 FROM DUAL;CREATE OR REPLACE FUNCTION GET_STROKE_COUNT(F_WORD IN VARCHAR2 )
RETURN INT
AS
I INT:=0;
BEGIN
SELECT MAX(STROKE_COUNT)+1 INTO I FROM TB_STROKE where nlssort(WORD,'NLS_SORT=SCHINESE_STROKE_M')<nlssort(F_WORD,'NLS_SORT=SCHINESE_STROKE_M');
RETURN I;
END GET_STROKE_COUNT;--测试
SELECT GET_STROKE_COUNT('甲') FROM DUAL;
--显示5
SELECT GET_STROKE_COUNT('骨') FROM DUAL;
--显示9
SELECT GET_STROKE_COUNT('文') FROM DUAL;
--显示4
--SQL内直接调用
SELECT MAX(STROKE_COUNT)+1 FROM TB_STROKE where nlssort(WORD,'NLS_SORT=SCHINESE_STROKE_M')<nlssort('甲','NLS_SORT=SCHINESE_STROKE_M');不得不说的是,以上存在问题的一个方面是TB_STROKE内插入的记录没有代表性,因为SELECT nlssort('二','NLS_SORT=SCHINESE_STROKE_M') FROM DUAL
UNION ALL
SELECT nlssort('丁','NLS_SORT=SCHINESE_STROKE_M') FROM DUAL
UNION ALL
SELECT nlssort('人','NLS_SORT=SCHINESE_STROKE_M') FROM DUAL显示的结果为
NLSSORT('二','NLS_SORT=SCHINES
3B3E0000010001
3B360000010001
3B4E0000010001
所以必须保证nlssort([],'NLS_SORT=SCHINESE_STROKE_M')同等笔画中最小.
下面会有更精彩的回复.