CONNECT_BY_ROOT实现行列转换
10g以下版本的ORACLE可以通过DECODE等实现行列转换,[@more@] ORACLE 10g开始新增的CONNECT_BY_ROOT能比较方便地实现行列转换。 例: 有一表ABC,字段信息包括region(地区),name(国家),population(人口)。 表中记录信息如下: region name population A A1 1000 A A2 5000 B B1 2000 B B2 3000 ...... 要求用sql查询语句实现以下结果: A_num B_num ...... 6000 5000 ...... 实现: SQL>Create Table ABC ( region Char(10), Name Char(20), population Number ); /
不使用索引的查询
尽管创建了索引,但是由于不适当的查询条件,往往会导致索引失效。[@more@]SQL>CREATE TABLE tTest(id1 char(10) NOT NULL,id2 char(10) NOT NULL,id3 char(10) NOT NULL,name varchar2(100),value number(8));SQL>CREATE INDEX idx_tTest_1 ON tTest(id1);SQL>CREATE INDEX idx_tTest_2 ON tTest(name);SQL>CREATE INDEX idx_tTest_3 ON tTest(value);SQL>CREATE INDEX idx_tTest_4 ON tTest (id1,id2,id3);■ 索引列使用NOT比较时 × select * from tTest where id1 <> '001'; × select * from tTest where
判断字符串只包含字母或者数字
ORACLE 10g新增了正则表达式,可以通过正则表达式实现,也可以通过自定义的函数实现:[@more@]create or replace function getStringType(stext in varchar2) return varchar2 is Result varchar2(4000); idx Number; ilen Number; inum Number; bnum Boolean; bchar Boolean; begin Result := ''; bnum := False; bchar := False; idx := 0; ilen := length(trim(stext)); For idx In 0 .. ilen -1 Loop inum := ascii(substr(stext,idx,1)); If inum >= 48 And inum <= 57 Then bnum := Tr
快速删除重复纪录
删除tTest表里字段col1值相同的纪录:[@more@]■首先通过如下的SQL查询重复的纪录SQL>SELECT * FROM tTest t1 WHERE rowid=(SELECT MIN(rowid) FROM tTest t2 WHERE t1.col1=t2.col1 HAVING COUNT(*)>1);■确认无误后,删除这些重复的纪录。SQL>DELETE FROM tTest t1 WHERE rowid>(SELECT MIN(rowid) FROM tTest t2WHERE t1.col1=t2.col1);■确认重复纪录是否删除:SQL>SELECT * FROM tTest t1 WHERE rowid=(SELECT MIN(rowid) FROM tTest t2 WHERE t1.col1=t2.col1 HAVING COUNT(*)>1);■如果没有记录返回,则重复纪录