--1.遍历字符串
--1.1.建立测试视图
CREATE OR REPLACE VIEW V AS
SELECT '天天向上' AS 汉字,'TTXS' AS 首拼 FROM DUAL;
--要求每个汉字对应相应的首拼字母显示
SELECT SUBSTR(汉字,LEVEL,1) 汉字,SUBSTR(首拼,LEVEL,1) 首拼,LEVEL
FROM V
CONNECT BY LEVEL <=4;
/*总结:CONNECT BY是树形查询的一个子句,后面的LEVEL是一个“伪列”,表示树形中的级别层次,通过LEVEL<=?循环?次,就形成?行数据,LEVEL以1为步长递增*/
--2.字符串文字中包含引号
SELECT 'I''M MR.YAN' PROFILE FROM DUAL;
SELECT NQ'[I'M MR.YAN']' PROFILE FROM DUAL;
SELECT NQ'{I'M MR.YAN'}' PROFILE FROM DUAL;
SELECT NQ'(I'M MR.YAN')' PROFILE FROM DUAL;
SELECT Q'<I'M MR.YAN>' PROFILE FROM DUAL;
/*总结:
*1.在SQL中,'可以使用两个'来表达;
*2.使用q-quoet特性:Q'{***}',***是所要输入的内容,如果其中包含单引号,那么单句执行可以正常显示,两个以上合并执行就会报错;
*3.使用NQ'{***'}'可以消除界定符}前面的',其实可以消除}前的任一单字符,这里是为了中和单数'所带来的的语法错误*/
--3.计算字符在字符串中出现的次数
--3.1.建立测试视图
CREATE OR REPLACE VIEW V AS
SELECT 'A,B,C' AS STRS FROM DUAL;
--3.2.ORACLE 11G新函数REGEXP_COUNT
SELECT REGEXP_COUNT(STRS,',')+1 AS CNT FROM V;
--3.3.使用REGEXP_REPLACE
SELECT LENGTH(REGEXP_REPLACE(STRS,'[^,]'))+1 AS CNT FROM V;
/*^代表否定的意思*/
--3.4使用TRANSLATE
SELECT LENGTH(TRANSLATE(STRS,','||STRS,','))+1 AS CNT FROM V;
--3.5.如果分隔符长度大于1,使用3.4的语句则有误
CREATE OR REPLACE VIEW V AS
SELECT 'A$%B$%C' AS STRS FROM DUAL;
--错误
SELECT LENGTH(TRANSLATE(STRS,'$%'||STRS,'$%'))+1 AS CNT FROM V;
--正确
SELECT LENGTH(TRANSLATE(STRS,'$%'||STRS,'$%'))/LENGTH('$%')+1 AS CNT FROM V;
--推荐
SELECT REGEXP_COUNT(STRS,'\$%')+1 AS CNT FROM V;
--4.删除指定字符,如C和E
SELECT TRANSLATE('ABCDE',''||'CE','')AS STR FROM DUAL;
SELECT REGEXP_REPLACE('ABCDE','[CE]')AS STR FROM DUAL;
--5.区隔字母和数字
SELECT REGEXP_REPLACE('A1B2C3','[0-9]','') AS STR,REGEXP_REPLACE('A1B2C3','[^0-9]','') AS NUM FROM DUAL;
SELECT TRANSLATE('A1B2C3','',' ') AS STR,TRANSLATE('A1B2C3',''||'A1B2C3','') AS NUM FROM DUAL;
--6.查询只包含字母或数字型的数据
--6.1.建立测试视图
CREATE OR REPLACE VIEW V AS
SELECT '' AS DATA FROM DUAL UNION ALL
SELECT 'ABC' FROM DUAL UNION ALL
SELECT 'ABC123' FROM DUAL UNION ALL
SELECT '123ABC' FROM DUAL UNION ALL
SELECT 'A1B2C3' FROM DUAL UNION ALL
SELECT '123ABC$#' FROM DUAL UNION ALL
SELECT '123$' FROM DUAL UNION ALL
SELECT 'A 5' FROM DUAL;
--6.2.使用正则表达式
SELECT DATA FROM V WHERE REGEXP_LIKE(DATA,'^[0-9A-Za-z]+$');
/*^不在方括号里时表示字符串开始,$表示字符串结束,+表示重复1次以上*/
--也可以使用*来代替+,*表示重复0次以上,也就是说比上一句多了一个判断条件:...OR LIKE ''...
SELECT DATA FROM V WHERE REGEXP_LIKE(DATA,'^[0-9A-Za-z]*$');
--与上一句效果一样,可见... OR LIKE ''并不影响结果,他实际不返回值
SELECT ENAME FROM EMP WHERE EMPNO LIKE '';
--7.提取姓名的大写首字母缩写
CREATE OR REPLACE VIEW V AS
SELECT 'Micheal Jackson' AS AL FROM DUAL;
SELECT REGEXP_REPLACE (V.AL,'([[:upper:]])(.*)([[:upper:]])(.*)','\1.\3') AS SX FROM V;
--8.根据表中的行创建一个分隔列
--8.1.WM_CONCAT(版本11.2以前返回值为VARCHAR,后面变为CLOB)
SELECT DEPTNO,SUM(SAL) AS TOTAL_SAL,WMSYS.WM_CONCAT(ENAME) AS TOTAL_ENAME FROM EMP GROUP BY DEPTNO;
--8.2.LISTAGG(src,'分隔符') WITHIN GROUP()
SELECT DEPTNO,SUM(SAL) AS TOTAL_SAL,LISTAGG(ENAME,',') WITHIN GROUP(ORDER BY ENAME) AS TOTAL_ENAME FROM EMP GROUP BY DEPTNO;
--9.提取第N个分隔的子串
--9.1.建立测试视图
CREATE OR REPLACE VIEW V AS
SELECT WM_CONCAT(ENAME) AS NAME FROM EMP WHERE DEPTNO IN ('','') GROUP BY DEPTNO;
SELECT * FROM V;
NAME
--------------------------------------------------------------------------------
CLARK,KING,MILLER
SMITH,ADAMS,FORD,SCOTT,JONES
--9.2.提取第二个名字,也就是KING和ADAMS
SELECT REGEXP_SUBSTR(V.NAME,'[^,]+',1,2) AS SUBSTR FROM V;
/**
*1.参数2:“^"在方括号里表示否,+表示匹配1次以上,'[^,]+'表示匹配不包含逗号的多个字符,也就是各个子串
*2.参数3:1表示从第一个字符开始
*3.参数4:2表示第二个能匹配'[^,]+'的字符串,也就是KING和ADAMS
*/
--10.分解IP地址
--10.1.建立测试视图
CREATE OR REPLACE VIEW V AS
SELECT '192.168.0.66' AS IP FROM DUAL;
--10.2.分拆,因为IP中.的个数固定为3,所以不用加判断
SELECT REGEXP_SUBSTR(V.IP,'[^.]+',1,LEVEL) AS SUB_IP
FROM V
CONNECT BY LEVEL <=4;
--或直接转置为行
SELECT
REGEXP_SUBSTR(V.IP,'[^.]+',1,1) AS A,
REGEXP_SUBSTR(V.IP,'[^.]+',1,2) AS B,
REGEXP_SUBSTR(V.IP,'[^.]+',1,3) AS C,
REGEXP_SUBSTR(V.IP,'[^.]+',1,4) AS D
FROM V;
--11.将分隔数据转换为多值IN列表
--11.1.建立测试视图
CREATE OR REPLACE VIEW V AS
SELECT 'YAN,WEI,TIAN' AS LOVE FROM DUAL;
--11.2.使用REGEXP_SUBSTR和LEVEL配合
SELECT REGEXP_SUBSTR(V.LOVE,'[^,]+',1,LEVEL) AS SUB_LOVE
FROM V
CONNECT BY LEVEL <=(SELECT LENGTH(TRANSLATE(LOVE,','||LOVE,','))+1 FROM V);
--12.按字母顺序排列字符串
--12.1.拆分
VAR V_ENAME VARCHAR2(50);
EXEC :V_ENAME := 'ADAMS';
SELECT :V_ENAME AS ENAME ,SUBSTR(:V_ENAME,LEVEL,1) AS C FROM DUAL
CONNECT BY LEVEL <= LENGTH(:V_ENAME);
--12.2.合并
SELECT ENAME,
(
SELECT LISTAGG(SUBSTR(ENAME,LEVEL,1),'') WITHIN GROUP (ORDER BY (SUBSTR(ENAME,LEVEL,1)) ASC)
FROM DUAL
CONNECT BY LEVEL<=LENGTH(ENAME)
)
AS NEW_NAME
FROM EMP;
--12.3.去重
SELECT ENAME,
(
SELECT LISTAGG(MIN(SUBSTR(ENAME,LEVEL,1)),'') WITHIN GROUP (ORDER BY MIN(SUBSTR(ENAME,LEVEL,1)) ASC)
FROM DUAL
CONNECT BY LEVEL<=LENGTH(ENAME)
GROUP BY SUBSTR(ENAME,LEVEL,1)
)
AS NEW_NAME
FROM EMP;

Oracle查询优化-使用字符串的更多相关文章

  1. oracle 查询优化改写

    -----------书籍: oracle 查询优化改写-----------第1个“C###oracle”为登录数据库的用户名,第2个“oracleChange”为登录数据库的密码“oracleCh ...

  2. Oracle 查询优化的基本准则详解

      注:报文来源:想跌破记忆寻找你 < Oracle 查询优化的基本准则详解 > Oracle 查询优化的基本准则详解 1:在进行多表关联时,多用 Where 语句把单个表的结果集最小化, ...

  3. 【书评:Oracle查询优化改写】第五至十三章

    [书评:Oracle查询优化改写]第五至十三章 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知 ...

  4. 【书评:Oracle查询优化改写】第三章

    [书评:Oracle查询优化改写]第三章 BLOG文档结构图       导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 隐含参数 ...

  5. 【书评:Oracle查询优化改写】第二章

    [书评:Oracle查询优化改写]第二章 BLOG文档结构图 在上一篇中http://blog.itpub.net/26736162/viewspace-1652985/,我们主要分析了一些单表查询的 ...

  6. oracle中一个字符串包含另一个字符串中的所有字符

    oracle中一个字符串包含另一个字符串中的所有字符 --解决监理报告中所勾选的标段信息,与该用户所管理的标段字符串不匹配的问题. select * from a where instr(a,b)&g ...

  7. oracle 插入含&字符串

    1.创建表 SQL> create table t(id number,name varchar2(20)); 表已创建. 2.常规方式插入 SQL> insert into t valu ...

  8. Oracle 去掉重复字符串

    create or replace function remove_same_string(oldStr varchar2, sign varchar2) return varchar2 is /** ...

  9. 《Oracle查询优化改写技巧与案例》学习笔记-------使用数字篇

    一个系列的读书笔记,读的书是有教无类和落落两位老师编写的<Oracle查询优化改写技巧与案例>. 用这个系列的读书笔记来督促自己学习Oracle,同时,对于其中一些内容,希望大家看到以后, ...

随机推荐

  1. jQuery 复选框全选/取消全选/反选

    jQuery实现的复选框全选/取消全选/反选及获得选择的值. 完整代码: <!DOCTYPE html> <html> <head> <script type ...

  2. [na]双绞线线序+POE供电网线

    0 重点-8根线的细节 传输数据线: 一般情况下会用1236(橙白.橙.绿白.绿)传输数据,1.2用于发送,3.6用于接收, 供电线: 45(蓝.蓝白)电源正极 78(棕白.棕)电源负极. 一 网线线 ...

  3. http请求头中的Content-Type属性在angular 和 node中的用法

    post请求的请求体有以下两种格式: 1. 字符串: 'name=code_bunny&age=12' 这种格式的请求体,需要配置请求头 'Content-Type':'application ...

  4. innerHTML与innerText区别

    document 对象中有innerHTML和innerText 两个属性, 这两个属性都是获取document对象的文本内容的,这两个属性间有哪些区别呢?通过几个例子来看一下. 示例1 <ht ...

  5. dubbo的一些默认变量

    dubbo默认变量表 变量名 描述 默认值 用途 DEFAULT_IO_THREADS 默认IO线程 Math.min(Runtime.getRuntime().availableProcessors ...

  6. GetLastError()返回值大全

    [0]-操作成功完成.[1]-功能错误.[2]-系统找不到指定的文件.[3]-系统找不到指定的路径.[4]-系统无法打开文件.[5]-拒绝访问.[6]-句柄无效.[7]-存储控制块被损坏.[8]-存储 ...

  7. javascript基础学习--HTML DOM

    写在前面的话:由于学校没有开过javascript这门课,所以平时用javascript时都是用到什么就去搜什么样的代码,但是在工作中有时候搜来的代码总是有那么点小问题,而当自己想去修改时,却又无从下 ...

  8. C++Primer 4th edition读书笔记-第二章

    1 变量的定义用于为变量分配存储空间,还可以为变量指定初始值.在一个程序中,变量有且只有一个定义.声明用于向程序表明变量的名字和类型.定义也是声明:当定义变量时,我们声明了它的类型和名字.可以通过使用 ...

  9. xslt转换xml

    实现json--> xml --(xlst)--> xml pom依赖 <dependency> <groupId>net.sf.json-lib</grou ...

  10. asp.net实现md5加密

    MD5加密简单的说就是把一段明文 通过某种运算方式 求出密文.在ASP.NET中MD5的加密方式很简单,详细介绍看下文 MD5加密简单的说就是把一段明文 通过某种运算方式 求出密文.例如:明文为:ab ...