1、遍历字符串
2、计算字符在字符串中出现的次数
3、从字符串中删除不需要的字符
4、将字符和数字数据分离
5、判别字符串是不是字母数字型的
6、提取姓名的大写首字母缩写
7、按字符串中的部分内容排序
8、按字符串中的数值排序
9、根据表中的行创建一个分隔列表
10、按字母顺序排列字符串
11、判别可作为数值的字符串
12、提取第n个分隔的子串
13、分解IP地址

1、遍历字符串
1)、select * from t10 order by id asc;
        ID
———-
         1
         2
         3
         4
         5
         6
         7
         8
         9
        10
2)、
select substr(e.ename, iter.id, 1) as c
from (select 'abcdefg' ename from dual) e,
     (select * from t10 order by id) iter
where iter.id <= length(e.ename)
说明,t10表只是个辅助表而已,书上称之为“基干表”。在这里有一点需要注意的就是这里的字符串'abcdefg'长度是小于10的,所以在这里使用t10可以实现我们的需求。假若字符串长度大于10,那么就不行了。所以我们应该保证基干表中的行数要大于字符串的长度才行。

2、计算字符在字符串中出现的次数
例如:'10,cleak,manager'计算在这字符串中有多少个逗号。
思路:首先计算出原字符串的长度,然后计算去掉逗号后字符串的长度,这两者的差就是逗号在该字符串中出现的次数。
区别:length求得是字符长度,lengthb求得是字节长度。
方法一
select lengthb('10,cleak,manager')-lengthb(replace('10,cleak,manager', ',', '')) count from dual;
方法二
select lengthb(translate('10,cleak,manager', ','||'10,cleak,manager', ',')) count from dual;
方法三,适用于11g以上
select regexp_count('10,cleak,manager', ',') count from dual;

3、从字符串中删除不需要的字符
例如,现在要求从ENAME列中删除元音字母(a,e,i,o,u),从SAL列中删除0。
说明,REPLACE、TRANSLATE函数用法
select ename,
       –先使用translate()把元音字母都转换为一个符号',',完了再使用replace去掉符号','
       replace(translate(ename, upper('aeiou'), ','), ',', '') as sub_ename,
       sal,
       replace(sal, 0, '') as sub_sal
  from emp;

4、将字符和数字数据分离
例如,select ename||sal as data from emp,现在要求把data分开为两列,字符部分一列,数字部分一列。
说明,LPAD(String a, int length, String addString),作用:把addString添加到a的左边,length是返回值的长度。
select replace(translate(data, '1234567890', '0000000000'), '0', '') as ename,
       to_number(replace(translate(lower(data),
                                   lower('abcdefghijklmnopqrstuvwxyz'),
                                   rpad('z', 26, 'z')),
                         'z',
                         '')) as sal
  from (select ename || sal as data from emp);

5、判别字符串是不是字母数字型的
create view V as
   select ename as data
   from emp
   where deptno=10
union all
    select ename||', $'||cast(sal as varchar2(10))||'.00' as data
    from emp
    where deptno=20
union all
    select ename||cast(sal as varchar2(20)) as data
    from emp
    where deptno=30

现在要求查询出为字母数字型的行,也就是说4-8要去掉,因为其中除了字母和数字还包含了其他字符。
select data
  from v
 where translate(lower(data),
                 '0123456789abcdefghijklmnopqrstuvwxyz',
                 rpad('z', 36, 'z')) = rpad('z', length(data), 'z');

6、提取姓名的大写首字母缩写
例如,Stewie Griffin,要返回结果如:S.G.

select replace(replace(translate(replace('Stewie Griffin','.',''),
                                 'abcdefghijklmnopqrstuvwxyz',
                                 rpad('#',26,'#')),'#',''),
               ' ',
               '.')||'.'
from dual

7、按字符串中的部分内容排序
select ename, substr(ename, length(ename)-1, 2) subename from emp order by substr(ename, length(ename)-1, 2)

8、按字符串中的数值排序
select data,
to_number(replace(translate(data,replace(translate(data,'0123456789','##########'),'#'),rpad('#',20,'#')),'#')) num
from V order by
to_number(replace(translate(data,replace(translate(data,'0123456789','##########'),'#'),rpad('#',20,'#')),'#'))

9、根据表中的行创建一个分隔列表
SELECT DEPTNO, LTRIM(SYS_CONNECT_BY_PATH(ENAME, ','), ',') EMPS
  FROM (SELECT DEPTNO,
               ENAME,
               ROW_NUMBER() OVER(PARTITION BY DEPTNO ORDER BY EMPNO) RN,
               COUNT(*) OVER(PARTITION BY DEPTNO) CNT
          FROM EMP)
 WHERE LEVEL = CNT
 START WITH RN = 1
CONNECT BY PRIOR DEPTNO = DEPTNO
       AND PRIOR RN = RN – 1

10、按字母顺序排列字符串
————————-
ADAMS      AADMS
ALLEN      AELLN
BLAKE      ABEKL
CLARK      ACKLR
FORD       DFOR
JAMES      AEJMS
JONES      EJNOS
KING       GIKN
MARTIN     AIMNRT
MILLER     EILLMR
SCOTT      COSTT
OLD_NAME   NEW_NAME

sql语句
SELECT OLD_NAME, NEW_NAME
  FROM (SELECT OLD_NAME, REPLACE(SYS_CONNECT_BY_PATH(C, ' '), ' ') NEW_NAME
          FROM (SELECT E.ENAME OLD_NAME,
                       ROW_NUMBER() OVER(PARTITION BY E.ENAME ORDER BY SUBSTR(E.ENAME, ITER.POS, 1)) RN,
                       SUBSTR(E.ENAME, ITER.POS, 1) C
                  FROM EMP E, (SELECT ROWNUM POS FROM EMP) ITER
                 WHERE ITER.POS <= LENGTH(E.ENAME)
                 ORDER BY 1)
         START WITH RN = 1
        CONNECT BY PRIOR RN = RN – 1
               AND PRIOR OLD_NAME = OLD_NAME)
 WHERE LENGTH(OLD_NAME) = LENGTH(NEW_NAME);

11、判别可作为数值的字符串

12、提取第n个分隔的子串

13、分解IP地址
SELECT IP,
       SUBSTR(IP, 1, INSTR(IP, '.', 1, 1) – 1) A,
       SUBSTR(IP,
              INSTR(IP, '.', 1, 1) + 1,
              INSTR(IP, '.', 1, 2) – INSTR(IP, '.', 1, 1) – 1) B,
       SUBSTR(IP,
              INSTR(IP, '.', 1, 2) + 1,
              INSTR(IP, '.', 1, 3) – INSTR(IP, '.', 1, 2) – 1) C,
       SUBSTR(IP, INSTR(IP, '.', 1, 3) + 1) D
  FROM (SELECT '192.168.112.101' AS IP FROM DUAL);

SQL Cookbook—字符串的更多相关文章

  1. MSSQL Server数据库的四种连接方法和sql连接字符串

    MSSQL Server数据库的四种连接方法和sql连接字符串 分类: [ 03 ] C#(131) [ 07 ] SQL Server(68) [ 01 ] .NET(189) 今天用SQL Ser ...

  2. sql 解析字符串添加到临时表中 sql存储过程in 参数输入

    sql 解析字符串添加到临时表中  sql存储过程in 参数输入 解决方法 把字符串解析 添加到 临时表中 SELECT * into #临时表   FROM dbo.Func_SplitOneCol ...

  3. Sql Sever 字符串截取汉字

    最近需要在SQL的字符串中截取汉字,利用unicode函数判断字符的unicode编码,根据编码范围过滤掉非汉字字符. 写成了一个function /*@str 需要获取汉字的字符串*/ create ...

  4. sql server 字符串替换函数REPLACE

    sql server 字符串替换函数REPLACE函数的使用 <pre name="code" class="sql">--参数1:需要替换字符的母 ...

  5. 《SQL CookBook 》笔记-第一章-检索记录

    目录 第一章 检索记录 1.1检索所有行和列 1.2筛选行 1.3查找满足多个查询条件的行 1.4筛选列 1.5创建列的别名 1.6 在where子句中引用别名列 1.7 串联多列的值 1.8 在se ...

  6. SQL 操作字符串

    SQL操作字符串相对来说比较难一点,现在总结几个常用的SQL 对字符串的操作: declare @dd nvarchar(12) set @dd='2015-03-13' print @dd decl ...

  7. sql server字符串的类型

    sql server字符串分为不同的类型,下面就将为您介绍几个sql server字符串的常见类型,希望对您学习sql server字符串能有所帮助. nchar 此数据类型可存储1~4000个定长U ...

  8. SQL中字符串截取、连接、替换等函数的用法

    一.SQL中SUBSTRING函数的用法1.功能:返回字符.二进制.文本或图像表达式的一部分2.语法:SUBSTRING ( expression, start, length )3.QL 中的 su ...

  9. C# 过滤sql特殊字符串方法

    1. /// <summary>    /// 过滤不安全的字符串    /// </summary>    /// <param name="Str" ...

随机推荐

  1. PyCharm社区版+Django搭建web开发环境-2

    接上一篇:PyCharm社区版+Django搭建web开发环境-1 1. 创建好django项目并建立app应用:web 2. setting.py:配置app应用 INSTALLED_APPS = ...

  2. 使用Amazon Simple Queue Service(SQS) 实现简单的消息服务

    一  引言 亚马逊Amazon作为云计算的领跑者推出了很多云服务,最近因为项目的原因,需要用到SQS服务,因此简要地写下这篇随笔,一来方便以后查阅,二来方便共享一些简单的操作. SQS即可以理解为一个 ...

  3. Linux Guard Service - 守护进程的作用、用途、父进程标识的特点

    让test2直接成为守护进程 [root@localhost 02]# cat test2.c //test2 #include<stdio.h> #include<unistd.h ...

  4. Partition--分区Demo

    --============================================================= --创建分区函数 --创建500分区,分区键按照1000依次递增 CRE ...

  5. redis内网无法连接的问题

    1.修改redis服务器的配置文件 vi redis.conf 注释以下绑定的主机地址 # bind 127.0.0.1 2.修改redis服务器的参数配置 修改redis的守护进程为no ,不启用 ...

  6. MySQL数据库(三)

    1. 创建表 create table student( id int unsigned not null auto_increment primary key, name varchar(8) no ...

  7. Ubuntu16.04实用python脚本 - 启动nautilus(Gnome的文件管理器)!

    nautilus是Gnome的图形的文件管理器,可以很方便管理各种文件,但是通常我们不是在root用户下,如果想在root下使用,必须在shell里面输入命令: sudo nautilus 这样做固然 ...

  8. linux命令之系统管理命令(上)

    1.lsof:查看进程打开的文件 该命令可以列举系统中已经被打开的文件,可以根据文件找到对应的进程信息,同时也可以根据进程信息找到进程打开的文件. 参数 说明 -c 进程名 显示指定的进程名打开的文件 ...

  9. day02.5-集合内置方法

    集合——set的定义:test = {1,2,3,4,5} 或 test = frozenset(1,2,3,4,5) 特点:1. 集合是可变数据类型 2. 集合中元素是无序的,可以是数字.字符串与元 ...

  10. OCP考试最新052题库分析整理-28

    28.Which two are true about external tables? A. They support the ORACLE_DATAPUMP access driver. B. T ...